伪逆不产生正确的输出
Pseudo-inverse not producing correct output
我有许多 2x2 矩阵需要求逆。当使用 pinv(numpy pinv、scipy pinv 或 scipy pinv2)时,对于其中一些我得到的答案是 -30 的元素,这比它们应该的要小得多。该矩阵有一个大的(非零的)行列式,所以它是可逆的。如果我使用 scipy.linalg.inv,它工作正常。这些矩阵都非常相似,其中大部分都可以很好地与 pinv 一起使用。
有人知道这里会发生什么吗?
编辑:抱歉,忘记包含示例。如果我拿
A = [[1e2, -1.6e9], [-1.6e9, 3e16]]
然后使用 np.linalg.inv
得到 [6.81e-2, 3.63e-9; 3.63e-9, 2.27e-16]
,而 np.linalg.pinv
得到 [9.48e-32, -1.77e-24; -1.77e-24, 3.33e-17]
。
import numpy as np
A = np.matrix([[1e2, -1.6e9], [-1.6e9, 3e16]])
print(np.linalg.pinv(A))
print(np.linalg.inv(A))
问题在于矩阵具有非常不同的奇异值
np.linalg.svd(A)[1]
[3.00000000e+16, 1.46666666e+01]
而 pinv 默认有一个 rcond=1e-15 ,它决定是否必须包含奇异值。你可以简单地增加 rcond
np.linalg.pinv(A, rcond=1e-20) @ A
matrix([[ 9.99999996e-01, 2.06089933e-01],
[-1.93556853e-16, 1.00000001e+00]])
这解决了您眼前的问题,但您可能需要检查这些病态矩阵将如何影响最终结果。
我有许多 2x2 矩阵需要求逆。当使用 pinv(numpy pinv、scipy pinv 或 scipy pinv2)时,对于其中一些我得到的答案是 -30 的元素,这比它们应该的要小得多。该矩阵有一个大的(非零的)行列式,所以它是可逆的。如果我使用 scipy.linalg.inv,它工作正常。这些矩阵都非常相似,其中大部分都可以很好地与 pinv 一起使用。
有人知道这里会发生什么吗?
编辑:抱歉,忘记包含示例。如果我拿
A = [[1e2, -1.6e9], [-1.6e9, 3e16]]
然后使用 np.linalg.inv
得到 [6.81e-2, 3.63e-9; 3.63e-9, 2.27e-16]
,而 np.linalg.pinv
得到 [9.48e-32, -1.77e-24; -1.77e-24, 3.33e-17]
。
import numpy as np
A = np.matrix([[1e2, -1.6e9], [-1.6e9, 3e16]])
print(np.linalg.pinv(A))
print(np.linalg.inv(A))
问题在于矩阵具有非常不同的奇异值
np.linalg.svd(A)[1]
[3.00000000e+16, 1.46666666e+01]
而 pinv 默认有一个 rcond=1e-15 ,它决定是否必须包含奇异值。你可以简单地增加 rcond
np.linalg.pinv(A, rcond=1e-20) @ A
matrix([[ 9.99999996e-01, 2.06089933e-01],
[-1.93556853e-16, 1.00000001e+00]])
这解决了您眼前的问题,但您可能需要检查这些病态矩阵将如何影响最终结果。