2015-06-27 101 views
4

我有以下問題所困擾提取線性無關行:我有一些非常大的矩陣(比方說,至少,2000×2000,並可能在未來他們甚至會達到10000x10000)具有非常小的等級(2或3,稱爲N),我需要找到一個有效的Python例程來從它們中提取線性獨立行(或列,矩陣是對稱的!)。我試圖採用QR分解的Q矩陣的前N列,但它似乎不能正確工作(這可能是錯誤的?)。你有更好的主意嗎?的Python程序從秩虧矩陣

非常感謝!

編輯 這裏是Python代碼我用來實現由阿美Tavory建議的方法:

from numpy import absolute 
from numpy.linalg import qr 

q = qr(R)[1] #R is my matrix 
q = absolute(q) 
sums = sum(q,axis=1) 

i = 0 
while(i < dim): #dim is the matrix dimension 
    if(sums[i] > 1.e-10): 
     print "%d is a good index!" % i 
    i += 1 

這應該告訴我,如果該行不爲零,因此,如果的第i列R是線性無關的。

回答

4

Gram Schmidt process找到一個使用線性組合的基礎(相當於最大的獨立子集),並且QR Decomposition有效地模仿了這一點。

因此,您想要做的一種方法是將numpy.linalg.qr應用於轉置,並檢查矩陣的非零組件。相應的列(在轉置矩陣中,即原始矩陣中的行)是獨立的。


編輯經過一番搜索,我相信this Berkeley lecture解釋它,但這裏有例子

import numpy as np 

# 2nd column is redundant 
a = np.array([[1, 0, 0], [0, 0, 0], [1, 0, 1]]) 
>> np.linalg.qr(a)[1] # 2nd row empty 
array([[ 1.41421356, 0.  , 0.70710678], 
    [ 0.  , 0.  , 0.  ], 
    [ 0.  , 0.  , 0.70710678]]) 

# 3rd column is redundant 
a = np.array([[1, 0, 0], [1, 0, 1], [0, 0, 0], ]) 
>> np.linalg.qr(a)[1] # 3rd row empty 
array([[ 1.41421356, 0.  , 0.70710678], 
    [ 0.  , 0.  , -0.70710678], 
    [ 0.  , 0.  , 0.  ]]) 

# No column redundant 
a = np.array([[1, 0, 0], [1, 0, 1], [2, 3, 4], ]) 
>> np.linalg.qr(a)[1] # No row empty 
array([[ 2.44948974, 2.44948974, 3.67423461], 
    [ 0.  , 1.73205081, 1.73205081], 
    [ 0.  , 0.  , 0.70710678]]) 
+0

謝謝! 「相應的組件」是指開始矩陣的列/行還是R矩陣的列/行?對不起,我從來沒有這種方法使用... –

+1

等一下,我會盡力找到一個鏈接給你,如果你不熟悉這種方法。 –

+0

非常親切!因爲我還不清楚我應該在R中尋找什麼,以及如何將結果轉換到起始矩陣。 –

0

此處,我發現了一個解決我的問題的鏈接! Cauchy-Schwartz方法提議here工作得很好!