Python:计算伪逆矩阵的逆

时间:2015-07-13 11:21:00

标签: python numpy linear-algebra

我正在尝试计算矩阵的伪逆,这应该不是很困难。问题是反转矩阵。

我使用以下代码:

A=numpy.random.random_sample((4,5,))
A=mat(A)
B=pseudoinverse(A)

def pseudoinverse(A):
    helper=A.T*A
    print helper*helper.I
    PI=helper.I*A.T
    return PI`

测试这个我包括打印线。帮助者*助手。我应该团结一致。我得到的输出是:

 [[ 2.    -1.     0.     0.     3.   ]

 [ 0.     2.     0.     0.     3.5  ]

 [ 0.    -0.5    1.125 -1.     2.25 ]

 [ 2.     0.     0.25  -2.     3.   ]

 [ 0.     0.     0.5   -2.     4.   ]]

显然不是统一的。我不知道自己做错了什么,真的很想知道。

1 个答案:

答案 0 :(得分:0)

您的矩阵A没有完整的列级别。因此helper是单数且不可逆的(如果你print helper.I,你会看到一些非常大的数字。)

解决方案是计算右逆而不是左逆

helper = A * A.T
PI = A.T * helper.I

有关详细信息,请参阅Wikipedia

除非你这样做是为了锻炼,否则你也可以使用numpy's built in implementation of the pseudeinverse

修改

>>> numpy.random.seed(42)
>>> a = mat(numpy.random.random_sample((3, 4)))  # smaller matrix for nicer output
>>> h = a * a.T
>>> h * h.I
matrix([[  1.00000000e+00,   1.33226763e-15,   0.00000000e+00],
        [ -1.77635684e-15,   1.00000000e+00,   0.00000000e+00],
        [  0.00000000e+00,   1.33226763e-15,   1.00000000e+00]])

高达数字精度,这看起来非常像我的身份矩阵。

代码中的问题是A.T * A不可逆。如果您尝试反转这样的矩阵,则会得到错误的结果。 相比之下,A * A.T是可逆的。

您有两种选择:

  1. 更改乘法的方向
  2. 致电pseudoinverse(A.T)