Python: 计算伪逆矩阵的逆
Python: Calculating the inverse of a pseudo inverse matrix
我正在尝试计算一个矩阵的伪逆,这应该不是很困难。问题是反转矩阵。
我正在使用以下代码:
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`
为了测试这一点,我加入了打印行。 helper*helper.I 应该统一。我从中得到的输出是:
[[ 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. ]]
这显然不是统一的。我不知道我做错了什么,真的很想知道。
您的矩阵 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
是可逆的。
您有两个选择:
- 改变乘法方向
- 致电
pseudoinverse(A.T)
我正在尝试计算一个矩阵的伪逆,这应该不是很困难。问题是反转矩阵。
我正在使用以下代码:
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`
为了测试这一点,我加入了打印行。 helper*helper.I 应该统一。我从中得到的输出是:
[[ 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. ]]
这显然不是统一的。我不知道我做错了什么,真的很想知道。
您的矩阵 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
是可逆的。
您有两个选择:
- 改变乘法方向
- 致电
pseudoinverse(A.T)