不同的计算结果

2024-09-29 23:33:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: fromimportnumpynpmatrixdotgeneratepp
3条回答

不能直接回答您的问题,但您可以使用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

这里发生的事情很有趣:

{cd1>仅当你的公式是单数的时候。在

那为什么呢?在

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是可逆的,所以{}确实是单位矩阵

注意:您只能得到AI == A,因为您对这些术语的特殊评估顺序。在

在第二次计算IA2项时,您没有这个特殊的求值顺序,它将A作为结果。在

主要原因是当你使用非平方矩阵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)

相关问题 更多 >

    热门问题