Numpy反转了一个不可逆的矩阵

时间:2017-01-25 00:38:46

标签: python numpy linear-algebra

我的朋友和我在Python 2Python 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的反向实现有特殊原因吗?

2 个答案:

答案 0 :(得分:2)

正如DYZ所指出的那样,矩阵不可逆,因为它的等级是2而不是3.

你得到这样的结果的原因是因为numpy正在使用LU decomposition来计算逆。即使在矩阵是单数的情况下,该算法也可以产生结果。如果您对细节感兴趣,请阅读链接的维基百科文章。

请注意,生成的“逆”是不合适的。因此,如果你试图用它来解决线性方程组,它很可能会给你一堆NaN和Infs。

我认为numpy不会检查高性能库常见的结果质量。您可以通过将原始矩阵乘以假设的逆并且检查对角线上的数字是否接近1而其他数字是零来非常便宜地进行此类检查。由于浮点计算的性质,它们不一定完全等于零或一个

正如帝斯曼指出的那样,你的矩阵的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
>>>

答案 1 :(得分:1)

Rank = 2表示矩阵可逆。要使3x3矩阵可逆,其等级必须为3.