在NumPy中反转病态矩阵

时间:2014-10-01 23:42:14

标签: python numpy matrix inverse rounding-error

我试图反演协方差矩阵来计算马哈拉诺比斯距离。然而,我的协方差矩阵非常恶劣(条件数> 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 (这意味着不存在反转)。

非常感谢任何有关如何解决此问题的建议。在此先感谢您的所有努力! :)

1 个答案:

答案 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的示例中,行列式给出了非零值,但这是由于使用浮点数时的舍入误差。

所以,你想做的事情在数学上并不合理。如果您有两个变量和两个观察值,则只有两个点的散点图,并且可以确定协方差为零。如果我们试图计算马哈拉诺比斯距离,我们就会遇到问题。如果一个点不在最佳拟合线上,它肯定不是分布的一部分(因为协方差为零)使得马哈拉诺比斯距离无限...

这是你找到的问题。所以你需要从变量(非方形矩阵)开始观察更多的观察,或者重新考虑你想要做的事情。