numpy,相同计算不同的结果

时间:2015-06-13 10:45:58

标签: python numpy

我想计算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]

3 个答案:

答案 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?

我认为这是错误*错误给你正常结果的情况。

如何解决?

  1. 不要将Python用于理论问题:)
  2. 将P = randn(0.9 * h,h)改为P = randn(1.1 * h,h)

答案 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