+-
numpy反转不可逆矩阵
我和我的朋友在 Python 2和 Python 3中执行了以下代码行:

import numpy as np  
mat = np.array([[1,0,0],[-1,3,3],[1,2,2]]) 
np.linalg.inv(mat)

哪个返回:

array([[  1.00000000e+00,   0.00000000e+00,   0.00000000e+00],
   [  1.50119988e+16,   6.00479950e+15,  -9.00719925e+15],
   [ -1.50119988e+16,  -6.00479950e+15,   9.00719925e+15]])

鉴于这是奇怪的:

np.linalg.matrix_rank(mat)

返回2,因此表明矩阵不可逆.

我从此线程了解到,这可能是由于numpy和python处理浮点数的方式所致,尽管我的矩阵由整数组成.

mat打破numpy的逆实现有特定原因吗?

最佳答案
正如DYZ指出的,矩阵是不可逆的,因为矩阵的秩是2而不是3.

之所以得到这样的结果,是因为numpy使用LU decomposition来计算逆.即使您的矩阵是奇异的,该算法也可以产生结果.如果您对详细信息感兴趣,请阅读链接的维基百科文章.

请注意,产生的“逆”是不合时宜的.因此,如果您尝试使用它来求解线性方程组,则很可能会为您提供一堆NaN和Infs.

我猜想numpy不会检查高性能库常见的结果质量.通过将原始矩阵乘以假定的逆,然后检查对角线上的数字是否接近1以及其他数字是否为零,您可以非常便宜地进行自我检查.由于浮点计算的性质,它们不一定完全等于零或一.

正如DSM所指出的,矩阵的condition number确实很高.

>> cond(A)
ans =   2.4956e+16

因此,由于条件不佳的矩阵,您失去了16位精度.最重要的是由浮点不精确引起的错误.

顺便说一下,您的示例在Numpy 1.12.0中不起作用

>>> import numpy as np
>>> np.version.version
'1.12.0'

>>> import numpy as np
>>> mat = np.array([[1,0,0],[-1,3,3],[1,2,2]])
>>> np.linalg.inv(mat)
Traceback (most recent call last):
  File "/Users/vlad/.pyenv/versions/CourseraDL/lib/python3.4/site-packages/numpy/linalg/linalg.py", line 90, in _raise_linalgerror_singular
    raise LinAlgError("Singular matrix")
numpy.linalg.linalg.LinAlgError: Singular matrix
>>>
点击查看更多相关文章

转载注明原文:numpy反转不可逆矩阵 - 乐贴网