2017-08-31 267 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',如果幅度与原始矩阵和反转矩阵匹配 –