numpy.linalg.inv返回奇异矩阵的逆

时间:2017-09-09 03:00:50

标签: python numpy singular

下面的矩阵是单数,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]])```

2 个答案:

答案 0 :(得分:2)

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

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

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

在SciPy版本0.19之后,scipy.linalg.solve使用GESVX的“专家”驱动程序GESV,它还会报告条件编号并发出警告。这与错过奇点的情况下的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]])

答案 1 :(得分:1)

numpy团队的一句话:

  

该领域的事实上的惯例是矩阵中的错误   反转大多是默默无视---假设是用户   知道这是否需要检查(暗示   需要使用更加可控的近似反演方法---   正则化是依赖于问题的。)

DNF

似乎在1.13.0上给出错误