我想计算this fomula .
我认为结果是 A。
所以我用 numpy 写了一个 python 代码。
但是根据计算顺序,结果不是A。
是什么导致了这个?
import numpy as np
from numpy import *
from numpy.random import *
import decimal
#generate matrix A
A = randn(180,240)
A = np.array(A, dtype = decimal.Decimal )
#generate matrix P
h,w=A.shape
P = randn(0.9*h,h)
P = np.array(P, dtype = decimal.Decimal )
#it's OK. IA = A
PP = dot(P.T,P)
PPinv = np.linalg.inv(PP)
PPinvPP = dot(PPinv,PP)
PPinvPPinv = np.linalg.inv(PPinvPP)
I = dot(PPinvPPinv,PPinvPP)
IA = dot(I, A)
#I think IA2 must be A. but not A. Why?
PA = dot(P,A)
PPA = dot(P.T,PA)
PPinvPPA = dot(PPinv,PPA)
IA2 = dot(PPinvPPinv, PPinvPPA)
#print result
print "A;%0.2f" % A[0,0]
print "IA:%0.2f" % IA[0,0]
print "IA2:%0.2f" % IA2[0,0]
最佳答案
这里发生的事情很有趣:
一般来说,您的公式只有在 PP
是非奇异的情况下才是正确的。
那么为什么 AI == A
?
PP = dot(P.T,P)
PPinv = np.linalg.inv(PP)
PPinvPP = dot(PPinv,PP)
PPinvPPinv = np.linalg.inv(PPinvPP)
I = dot(PPinvPPinv,PPinvPP)
IA = dot(I, A)
这里有几点需要注意:
PP = dot(P.T,P)
是单数- =>
PPinv
不是真正的逆 - 但是
PPinvPP
是可逆的,所以I
确实是单位矩阵
注意:您只会得到 AI == A
,因为您对条款的评估顺序特殊。
在 IA2
项的第二次计算中,您没有这种特殊的评估顺序,结果是 A
。
关于python - numpy,相同的计算不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30817781/