Python 中的不确定性包:使用给定的协方差矩阵来获取数据不确定性
Uncertainties package in Python : use of given covariance matrix to get data uncertainties
我相信我的问题很容易理解,但我想说得很清楚,所以这篇post。
我在下面总结的初始情况与此 post (https://stats.stackexchange.com/questions/50830/can-i-convert-a-covariance-matrix-into-uncertainties-for-variables) 中解释的情况类似,但特别关注 python 包不确定性是如何处理的遇到这种情况。
情况如下:
我有一组数据点对应于一些测量的标称值(标称值,我指的是不考虑任何不确定性的裸值)。
每个数据点出来都有它的不确定性,也提供给我。更重要的是,由于测量中的一些系统性,不同的数据点不是独立的,而是相关的。因此,给了我一个完整的协方差矩阵,其中非对角线元素为非零。
我想做的是以不确定性适当传播的方式对我的数据进行计算。最终,我希望在控制台中以 标称值 +/- 不确定性 的形式显示值。
python 包 'uncertainties' 似乎是正确的方法,但我不确定它为我的 初始数据点 提供的不确定性数字的含义.
我所期望的是我的初始数据点的不确定性对应于 'naive' 标准差,即协方差矩阵对角线元素的平方根。这忽略了数据中的相关性,但是以 标称值 +/- 不确定性 的形式显示相关结果无论如何都不能显示相关性,只要是后者,这应该不是问题已正确考虑进一步计算。
但是包裹显示的是另外一个数字是不确定的,不知道从哪里来的。包文档帮助不大。我想知道我是否可能滥用了这个包。
谁能帮我了解情况?非常感谢!!
这是一个最小的可重现示例:
import uncertainties
import numpy as np
# To settle ideas, here are two different covariance matrices with same diagonals
# -> I expect them to lead to the same std deviations below, but this is not the case:
Cov_matrix1 = np.array([[0.00, 0.0, 0.0], [0.0, 1, 0], [0.0, 0, 4]], np.float64)
Cov_matrix2 = np.array([[0.00, 0.5, 3], [0.5, 1, 0.2], [3, 0.2, 4]], np.float64)
# here are some initial nominal values:
data_nominal = np.array([1, 2, 3], np.float64)
print(" The nominal values of data, whithout covariance matrix is ", data_nominal)
# I impose correlations in my data, using the above covariance matrices
correlated_data1 = np.asarray(uncertainties.correlated_values(data_nominal, Cov_matrix1))
correlated_data2 = np.asarray(uncertainties.correlated_values(data_nominal, Cov_matrix2))
# I print my data in the console, and see that data points have different uncertainties in both cases,
# even though the two covariance matrices have the same diagonals ... What is happening ?
print("\n First covariance matrix is ")
print(Cov_matrix1)
print("\n Data values are ", correlated_data1)
print("\n 2nd covariance matrix is ")
print(Cov_matrix2)
print("\n Data values are now ", correlated_data2)
我认为问题在于其中一个协方差矩阵是“非法的”,即
Cov_matrix2 = np.array([[0.00, 0.5, 3], [0.5, 1, 0.2], [3, 0.2, 4]], np.float64)
不是正数semi-definite,它有一个负特征值。因此,使用它在数学上是不可行的,这是包没有注意到的事情。事实上,包在没有警告或错误消息的情况下使用了这个非法矩阵,当然,产生的输出不能被认为是有意义的,因此出现了意想不到的行为。
我相信我的问题很容易理解,但我想说得很清楚,所以这篇post。
我在下面总结的初始情况与此 post (https://stats.stackexchange.com/questions/50830/can-i-convert-a-covariance-matrix-into-uncertainties-for-variables) 中解释的情况类似,但特别关注 python 包不确定性是如何处理的遇到这种情况。
情况如下:
我有一组数据点对应于一些测量的标称值(标称值,我指的是不考虑任何不确定性的裸值)。
每个数据点出来都有它的不确定性,也提供给我。更重要的是,由于测量中的一些系统性,不同的数据点不是独立的,而是相关的。因此,给了我一个完整的协方差矩阵,其中非对角线元素为非零。
我想做的是以不确定性适当传播的方式对我的数据进行计算。最终,我希望在控制台中以 标称值 +/- 不确定性 的形式显示值。 python 包 'uncertainties' 似乎是正确的方法,但我不确定它为我的 初始数据点 提供的不确定性数字的含义.
我所期望的是我的初始数据点的不确定性对应于 'naive' 标准差,即协方差矩阵对角线元素的平方根。这忽略了数据中的相关性,但是以 标称值 +/- 不确定性 的形式显示相关结果无论如何都不能显示相关性,只要是后者,这应该不是问题已正确考虑进一步计算。
但是包裹显示的是另外一个数字是不确定的,不知道从哪里来的。包文档帮助不大。我想知道我是否可能滥用了这个包。
谁能帮我了解情况?非常感谢!!
这是一个最小的可重现示例:
import uncertainties
import numpy as np
# To settle ideas, here are two different covariance matrices with same diagonals
# -> I expect them to lead to the same std deviations below, but this is not the case:
Cov_matrix1 = np.array([[0.00, 0.0, 0.0], [0.0, 1, 0], [0.0, 0, 4]], np.float64)
Cov_matrix2 = np.array([[0.00, 0.5, 3], [0.5, 1, 0.2], [3, 0.2, 4]], np.float64)
# here are some initial nominal values:
data_nominal = np.array([1, 2, 3], np.float64)
print(" The nominal values of data, whithout covariance matrix is ", data_nominal)
# I impose correlations in my data, using the above covariance matrices
correlated_data1 = np.asarray(uncertainties.correlated_values(data_nominal, Cov_matrix1))
correlated_data2 = np.asarray(uncertainties.correlated_values(data_nominal, Cov_matrix2))
# I print my data in the console, and see that data points have different uncertainties in both cases,
# even though the two covariance matrices have the same diagonals ... What is happening ?
print("\n First covariance matrix is ")
print(Cov_matrix1)
print("\n Data values are ", correlated_data1)
print("\n 2nd covariance matrix is ")
print(Cov_matrix2)
print("\n Data values are now ", correlated_data2)
我认为问题在于其中一个协方差矩阵是“非法的”,即
Cov_matrix2 = np.array([[0.00, 0.5, 3], [0.5, 1, 0.2], [3, 0.2, 4]], np.float64)
不是正数semi-definite,它有一个负特征值。因此,使用它在数学上是不可行的,这是包没有注意到的事情。事实上,包在没有警告或错误消息的情况下使用了这个非法矩阵,当然,产生的输出不能被认为是有意义的,因此出现了意想不到的行为。