我试图反演协方差矩阵来计算马哈拉诺比斯距离。然而,我的协方差矩阵非常恶劣(条件数> 10 ^ 17)。这显然会导致大的舍入误差,导致“矩阵逆”,实际上与实际逆相关性不大。
我的代码是:
sample = np.array([[523.77, 468.3, 491.55], [234.96, 221.17, 228.43], [342.02, 337.87, 351.31]], np.float64)
print "Sample:"
print sample
print
print "Sample Inverse:"
print np.linalg.inv(sample)
print
print "Sample x Sample Inverse:"
print np.dot(sample, np.linalg.inv(sample))
print
print
print "Cov(Sample):"
print np.cov(sample)
print "Determinant", np.linalg.det(np.cov(sample))
print "Condition Number", np.linalg.cond(np.cov(sample))
print
print "Cov(Sample) Inverse:"
print np.linalg.inv(np.cov(sample))
print
print "Cov(Sample) x Cov(Sample) Inverse:"
print np.dot(np.cov(sample), np.linalg.inv(np.cov(sample)))
这给出了以下结果:
Sample:
[[ 523.77 468.3 491.55]
[ 234.96 221.17 228.43]
[ 342.02 337.87 351.31]]
Sample Inverse:
[[ 0.01204863 0.03620989 -0.04040286]
[-0.10240561 0.36837033 -0.09623795]
[ 0.08675788 -0.38953001 0.13473714]]
Sample x Sample Inverse:
[[ 1.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 3.55271368e-15 1.00000000e+00 3.55271368e-15]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
# This is obviously fine
Cov(Sample):
[[ 775.9353 190.68715 40.55945 ]
[ 190.68715 47.58543333 15.68986667]
[ 40.55945 15.68986667 47.36003333]]
Determinant -1.3802775949e-10
Condition Number 3.45634882629e+17
Cov(Sample) Inverse:
[[ -1.45440004e+13 6.08180372e+13 -7.69277831e+12]
[ 6.08180372e+13 -2.54320238e+14 3.21685688e+13]
[ -7.69277831e+12 3.21685688e+13 -4.06895190e+12]]
Cov(Sample) x Cov(Sample) Inverse:
[[-0.9375 -1. 0.09375 ]
[-0.4375 -0.125 0.1953125]
[ 0. -0.25 1.0625 ]]
# This is wrong
这显然不是我想要的......
实际上,我的协方差矩阵也不是3x3,而是145x145矩阵,这使事情变得更糟:条件数现在大于10 ^ 18,而numpy.linalg.det()为行列式返回0 (这意味着不存在反转)。
非常感谢任何有关如何解决此问题的建议。在此先感谢您的所有努力! :)
答案 0 :(得分:0)
协变矩阵的秩是< = n-1,因此方阵的协变矩阵将始终是单数。这是协变矩阵性质的一部分(见https://stats.stackexchange.com/questions/60622/why-is-a-sample-covariance-matrix-singular-when-sample-size-is-less-than-number)
因此,虽然在给定numpy的示例中,行列式给出了非零值,但这是由于使用浮点数时的舍入误差。
所以,你想做的事情在数学上并不合理。如果您有两个变量和两个观察值,则只有两个点的散点图,并且可以确定协方差为零。如果我们试图计算马哈拉诺比斯距离,我们就会遇到问题。如果一个点不在最佳拟合线上,它肯定不是分布的一部分(因为协方差为零)使得马哈拉诺比斯距离无限...
这是你找到的问题。所以你需要从变量(非方形矩阵)开始观察更多的观察,或者重新考虑你想要做的事情。