2017-01-25 169 views
3

我的朋友和我在Python 2Python 3執行的代碼這一行:NumPy的反轉不可逆矩陣

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的逆向實現嗎?

+0

請澄清不工作:你的意思是「矩陣是_invertible_」或「矩陣不是_invertible_」? – DyZ

回答

1

Rank = 2意味着矩陣是而不是可逆。對於一個3×3矩陣是可逆的,其等級必須是3

+1

這可能是OPs部分的拼寫錯誤。看起來問題是:爲什麼Python將Matrix轉換爲不滿秩? – Akavall

+1

@Aavall不清楚。事實上,NumPy 1.10.4並不反轉它:'numpy.linalg.linalg.LinAlgError:奇異矩陣' – DyZ

+1

有趣的是,我能夠用'1.12.0'重現OP結果 – Akavall

2

由於DYZ指出矩陣不是可逆的,因爲它的級別是2不3

你得到這樣的結果,就是因爲numpy的是使用LU decomposition來計算逆。即使在矩陣奇異的情況下,該算法也可以產生結果。如果您對細節感興趣,請閱讀鏈接的維基百科文章。

請注意,產生的'逆'是失控的。所以如果你試圖用它來求解線性方程組,它很可能會給你一堆NaN和Infs。

我猜numpy不檢查高性能庫常見的結果質量。您可以通過將原始矩陣乘以假設的逆矩陣並檢查對角線上的數字是否接近1而其他數字是否爲零來非常便宜地進行此類檢查。由於浮點運算的性質,它們不一定完全等於零或一個

由於帝斯曼指出您的矩陣的condition number真的很高。

因此,由於此類病態矩陣,您正在丟失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

可能還想提一下這個矩陣非常大的條件編號。 – DSM