下面的矩阵是单数,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]])```
答案 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团队的一句话:
该领域的事实上的惯例是矩阵中的错误 反转大多是默默无视---假设是用户 知道这是否需要检查(暗示 需要使用更加可控的近似反演方法--- 正则化是依赖于问题的。)
似乎在1.13.0上给出错误