2017-08-31 347 views
1

我在做python的矩陣求逆,並且發現結果因數據比例而不同,這很奇怪。在python中有大值的矩陣的矩陣求逆

在下面的代碼中,預計A_inv/B_inv = B/A。但是,它表明,A_inv/B_inv和B/A之間的差異越來越大,這取決於數據範圍......這是因爲Python無法精確計算具有大值的矩陣的矩陣求逆嗎?

此外,我檢查了B的條件編號,這是一個常數〜3.016,無論規模是多少。

謝謝!

import numpy as np 
from matplotlib import pyplot as plt 

D = 30 
N = 300 

np.random.seed(10) 
original_data = np.random.sample([D, N]) 
A = np.cov(original_data) 
A_inv = np.linalg.inv(A) 


B_cond = [] 
diff = [] 

for k in xrange(1,10): 
    B = A * np.power(10,k) 
    B_cond.append(np.linalg.cond(B)) 
    B_inv = np.linalg.inv(B) 

    ### Two measurements of difference are used 

    diff.append(np.log(np.linalg.norm(A_inv/B_inv - B/A))) 
    #diff.append(np.max(np.abs(A_inv/B_inv - B/A))) 



# print B_cond 

plt.figure() 
plt.plot(xrange(1,10), diff) 
plt.xlabel('data(B)/data(A)') 
plt.ylabel('log(||A_inv/B_inv - B/A||)') 
plt.savefig('Inversion for large matrix') 

回答

0

我可能是錯的,但我認爲它來自機器中的數字表示。 當你處理很多數字時,你的逆矩陣的數量級將會很小(接近於零)。並clsoe爲零,浮點數的表示是不夠精確的,我猜... https://en.wikipedia.org/wiki/Floating-point_arithmetic

+0

是的,我不知道python如何計算反函數,但是'B'矩陣顯然在某些回合後具有行列式='inf'。不知道這是否會導致問題... –

0

沒有理由,你應該期望np.linalg.norm(A_inv/B_inv - B/A)等於任何特殊的東西。相反,您可以通過將原始矩陣乘以其逆來檢查逆計算的質量,並檢查行列式np.linalg.det(A.dot(A_inv)),它應該等於1.

+0

感謝您的回覆!我使用了'C = np.dot(B_inv,B)',它的對角線上有'1.000000',但非對角單元格中的值是'1e-17'的數量級。如何測試'C'是否是一個好的單位矩陣?謝謝! –

+0

我期待'np.linalg.norm(A_inv/B_inv - B/A)= 0',如果幅度與原始矩陣和反轉矩陣匹配 –