5

下面的矩阵是奇异的,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]])```
4

2 回答 2

6

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

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

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

在 SciPy 自 0.19 版以来,scipy.linalg.solve使用“专家”驱动程序GESVXGESV该驱动程序还报告返回条件编号并发出警告。这类似于 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]])
于 2017-09-09T13:01:50.987 回答
2

numpy 团队的一份说明:

该领域的实际约定是矩阵求逆中的错误大多被默默地忽略——假设用户知道这是否需要检查(这意味着需要更受控制的近似求逆方法) used --- 正则化取决于问题)。

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

然而,似乎在 1.13.0 上出现错误

于 2017-09-09T03:05:59.857 回答