Numpy反转一个不可逆矩阵。

5

我的朋友和我在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个回答

5
正如DYZ所指出的那样,该矩阵不可逆,因为它的秩是2而不是3。
你得到这样的结果的原因是因为numpy使用LU分解来计算逆。即使在矩阵奇异的情况下,此算法也可以产生结果。如果您对细节感兴趣,请阅读链接的维基百科文章。
请注意,生成的“逆”是不正确的。因此,如果您尝试使用它来解线性方程组,它很可能会给您一堆NaN和Inf。
我猜numpy不检查结果的质量,这在高性能库中很常见。您可以通过将原始矩阵乘以所谓的逆矩阵并检查对角线上的数字是否接近于1以及其他数字是否为零来非常便宜地进行此类检查。由于浮点计算的性质,它们不一定完全等于零或一。
正如DSM所指出的那样,您的矩阵条件数确实很高。
>> 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

Rank=2表示矩阵不可逆。对于一个3x3的矩阵来说,它必须满足等级为3才能够可逆。


2
那可能是OP笔误了。问题似乎是:为什么Python会反转一个非满秩矩阵? - Akavall
1
@Akavall 不太清楚。事实上,NumPy 1.10.4 没有对其进行反转:numpy.linalg.linalg.LinAlgError: Singular matrix - DYZ
1
有趣的是,我能够使用1.12.0重现OP的结果。 - Akavall
1
这可能取决于您的lapack版本,而不是您的numpy版本。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接