2015-07-13 965 views
1

我想要計算一個矩陣的僞逆應該不是很困難。問題是顛倒矩陣。Python:計算僞逆矩陣的逆

我使用下面的代碼:

A=numpy.random.random_sample((4,5,)) 
A=mat(A) 
B=pseudoinverse(A) 

def pseudoinverse(A): 
    helper=A.T*A 
    print helper*helper.I 
    PI=helper.I*A.T 
    return PI` 

測試這個我包括打印線。幫手*幫手。我應該團結一致。我從這裏得到的輸出是:

[[ 2. -1.  0.  0.  3. ] 

[ 0.  2.  0.  0.  3.5 ] 

[ 0. -0.5 1.125 -1.  2.25 ] 

[ 2.  0.  0.25 -2.  3. ] 

[ 0.  0.  0.5 -2.  4. ]] 

這顯然不是統一。我不知道我做錯了什麼,真的很想知道。

回答

0

您的矩陣A沒有滿欄排名。因此helper是單數,不可逆(如果你print helper.I,你會看到一些非常大的數字)。

解決的辦法是計算右逆代替左逆的:

helper = A * A.T 
PI = A.T * helper.I 

詳情請參閱Wikipedia

除非您正在做這個練習,否則您還可以使用numpy's built in implementation of the pseudeinverse

編輯

>>> numpy.random.seed(42) 
>>> a = mat(numpy.random.random_sample((3, 4))) # smaller matrix for nicer output 
>>> h = a * a.T 
>>> h * h.I 
matrix([[ 1.00000000e+00, 1.33226763e-15, 0.00000000e+00], 
     [ -1.77635684e-15, 1.00000000e+00, 0.00000000e+00], 
     [ 0.00000000e+00, 1.33226763e-15, 1.00000000e+00]]) 

截至數值精度,這看起來很像一個單位矩陣給我。

代碼中的問題是A.T * A不可逆。如果你嘗試顛倒這樣的矩陣,你會得到錯誤的結果。 相反,A * A.T是可逆的。

你有兩個選擇:

  1. 變化乘法
  2. 呼叫pseudoinverse(A.T)
+0

感謝您與PINV尖端的方向。這工作正常。不過,我想讓我的功能運行。 我應該注意我的線性代數類。您的代碼無法正常工作,因爲您的乘積排名靠後。此外,我不想改變乘法的方向... 即使在你的代碼中,helper * helper也不是統一的。不要問我爲什麼 – Glostas

+0

@Glostas當我嘗試'helper * helper.I'時,結果是統一的(參見編輯答案)。也許還有另一個隱藏在某個地方的問題? – kazemakase