我想计算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]
答案 0 :(得分:3)
这里发生的事情非常有趣:
一般来说,如果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
。
答案 1 :(得分:1)
主要原因是当你使用非方形矩阵P,其中高度小于宽度时,PP的行列式总是具有零值,但是由于计算误差,它是!= 0.所以之后这不可能计算出真正的PPinv,任何前进的步骤都没有意义。
P = randn(2,3)
P = np.array(P, dtype = decimal.Decimal )
PP = dot(P.T,P)
np.linalg.det(PP) #-5.2536080570332981e-34
那么为什么IA == A?
我认为这是错误*错误给你正常结果的情况。
如何解决?
答案 2 :(得分:0)
不能直接回答您的问题,但您可以使用Sympy来解决这些问题:
from IPython.display import display
import sympy as sy
sy.init_printing() # For LaTeX-like pretty printing in IPython
n = 5
A = sy.MatrixSymbol('A', 162, 240) # dimension 162x240
P = sy.MatrixSymbol('P', 162, 180) # dimensions 162x180
PTP = P*P.T
ex1 = (PTP.inverse() * PTP).inverse() * PTP.inverse() * PTP * A
display(ex1) # displays: A