【问题标题】:numpy.linalg.inv returns inverse for a singular matrixnumpy.linalg.inv 返回奇异矩阵的逆矩阵
【发布时间】:2018-02-17 23:39:37
【问题描述】:

下面的矩阵是奇异的,AFAIK 试图反转它应该会导致

numpy.linalg.linalg.LinAlgError: Singular matrix

但是,我确实得到了一些输出矩阵。请注意,输出矩阵是一个无意义的结果,因为它有一行 0(这是不可能的,因为矩阵的逆矩阵本身应该是可逆的)!

我是否遗漏了与浮点精度或伪逆计算而非真逆相关的内容?

$ np.__version__ 
'1.13.1'
$ np.linalg.inv(np.array([[2,7,7],[7,7,7],[8,7,7]]))
array([[  0.00000000e+00,   0.00000000e+00,   0.00000000e+00],
       [  3.43131400e+15,  -2.05878840e+16,   1.71565700e+16],
       [ -3.43131400e+15,   2.05878840e+16,  -1.71565700e+16]])```

【问题讨论】:

  • 我收到 numpy.linalg.linalg.LinAlgError: Singular matrix (numpy 1.11.3)。

标签: python numpy matrix-inverse singular


【解决方案1】:

在幕后,NumPy 和 SciPy(以及许多其他软件)回退到线性方程求解器的 LAPACK 实现(或 C 转换)(在本例中为 GESV)。

由于 GESV 首先执行 LU 分解,然后检查 U 矩阵的对角线是否完全为零,因此很难在分解中找到完全零。这就是为什么你没有得到奇异矩阵错误的原因。

除此之外,如果要与其他矩阵相乘,则永远不要反转矩阵,而是求解AX=B

在 SciPy 0.19 版以后,scipy.linalg.solve 使用 GESV 的“专家”驱动程序 GESVX,它还报告返回条件编号并发出警告。这类似于 matlab 的行为,以防错过奇点。

In [7]: sp.linalg.solve(np.array([[2,7,7],[7,7,7],[8,7,7]]), np.eye(3))
...\lib\site-packages\scipy\linalg\basic.py:223: RuntimeWarning: scipy.linalg.solve
Ill-conditioned matrix detected. Result is not guaranteed to be accurate.
Reciprocal condition number: 1.1564823173178713e-18
  ' condition number: {}'.format(rcond), RuntimeWarning)
Out[7]: 
array([[  0.00000000e+00,  -1.00000000e+00,   1.50000000e+00],
       [  3.43131400e+15,  -2.05878840e+16,   1.71565700e+16],
       [ -3.43131400e+15,   2.05878840e+16,  -1.71565700e+16]])

【讨论】:

    【解决方案2】:

    numpy 团队的一个注释:

    该领域的事实约定是矩阵中的错误 倒置大多被默默地忽略——假设用户 知道这是否是需要检查的东西(暗示 需要使用更可控的近似反演方法—— 正则化取决于问题)。

    https://github.com/numpy/numpy/issues/2074

    似乎在 1.13.0 上会出错

    【讨论】:

    • 非常相关,谢谢。基于该线程,它听起来确实像一个与精度相关的问题,但这让我想知道在什么情况下 numpy 会成功检测到奇异矩阵,以及为什么这个特定(和小)矩阵会失败......
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2017-07-18
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多