【问题标题】:Pseudo-inverse not producing correct output伪逆不产生正确的输出
【发布时间】:2021-11-24 10:57:43
【问题描述】:

我有许多要反转的 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))

【问题讨论】:

  • 您能否举一个失败的矩阵示例?
  • @Bob 是的 - 对不起。我现在添加了一个示例。

标签: python matrix-inverse


【解决方案1】:

问题是矩阵有非常不同的奇异值

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]])

这解决了您的直接问题,但您可能需要检查这些病态矩阵将如何影响最终结果。

【讨论】:

  • 稍微修正...条件数减少,而不是增加以获得所需的解决方案。
  • 谢谢@sgarizvi
  • 谢谢@Bob。我的背景是做回归。因此,幅度上的差异似乎只是由于我在矩阵中包含的 1 行(我只有一个特征)。我可以缩放特征值(例如除以最大值),还是会改变其他地方的情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多