2014-10-01 65 views
0

我想要反轉協方差矩陣來計算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派)。

任何建議如何解決這個問題可能會得到解決非常感謝。預先感謝您的所有努力! :)

回答

0

協變矩陣的秩爲< = n-1,所以方矩陣的協變矩陣將總是奇異的。這是協變矩陣性質的一部分(參見https://stats.stackexchange.com/questions/60622/why-is-a-sample-covariance-matrix-singular-when-sample-size-is-less-than-number

所以,儘管給定numpy的例子給出了行列式的非零值,但這是由於使用浮點數的舍入誤差。

所以,你試圖做的不是數學上合理的。如果有兩個變量和兩個觀察值,則只有兩個點的散點圖,並且可以肯定協方差爲零。如果我們然後試圖計算馬哈拉諾比斯距離,我們遇到了一個問題。如果一個點不在最佳擬合線上,它肯定不是分佈的一部分(因爲協方差爲零)使得馬氏距離無窮大...

這是您正在查找的問題。所以你需要從變量(一個非方矩陣)開始觀察更多的觀測數據,或者重新考慮你想要做的事情。