我想要反轉協方差矩陣來計算Mahalanobis距離。但是,我的協方差矩陣病情很嚴重(條件數> 10^17)。這顯然導致了大的舍入誤差,導致了「矩陣逆」,這實際上與真實的逆並無太大關係。在NumPy中反轉病態矩陣
我的代碼是:
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(這將意味着沒有反向ex派)。
任何建議如何解決這個問題可能會得到解決非常感謝。預先感謝您的所有努力! :)