2013-02-16 30 views
2

我有一個由鄰接矩陣表示的非常大的節點網絡。我想減少網絡中包含更重要節點的節點數量。我知道SVD可以幫助我實現這一點,並且我已經使用ILNumerics庫在鄰接矩陣上運行svd()方法。奇異值分解 - 社會網絡分析

有人可以簡單地向我解釋輸出是如何幫助我減少網絡的尺寸嗎? SVD過程給我留下了一個相同大小的矩陣,其下降值從對角線範圍從2到0。我如何知道刪除哪些尺寸被視爲不重要?

我很可能不正確地做這個過程,因此任何幫助將不勝感激!網上的許多解釋很快就會讓人感到非常困惑。

+1

什麼是你的重要節點?也許SVD不是你想要的。 – Steve 2013-02-16 17:03:09

回答

1

我對ILNumerics不太熟悉,所以我會試着解釋一下SVD在你的情況下能夠做什麼。首先,Wikipedia給出了SVD可能應用的一些基本信息。在你的情況下,關於「範圍,零空間和秩」和「低秩矩陣逼近」的部分特別感興趣。奇異值分解可以幫助您確定系統矩陣的排名。如果你的鄰接圖是稀疏的,那麼你的系統矩陣(比如一個N倍N矩陣)可能有一個小於N的秩M.在這種情況下,你可以計算它的低秩近似。也就是說,你構造了M倍M(M < N),忽略N - M個最小特徵值,因爲它們只對結果有很小的影響。在這種情況下,小的手段當然強烈地取決於你的應用。

編輯:在您的示例數據中,您的原始矩陣A已被分解爲A = outU svdOut outV。對角矩陣svdOut是A的特徵值奇異值的常數,而outU和outV的列/行分別是A的左奇異向量和右奇異向量。在你的例子中,奇異值是1.61803,1.41421,0.661803和0(兩次)。您的原始矩陣的排名因此由非零奇異值的數量(在您的示例中爲三個)給出。因此,您可以定義一個矩陣B = outU svdOut * outV,其中星號表示已刪除最不重要的奇異值。例如,你可以決定要忽略最小特徵值,從而

svdOut* = 
| 1.61803 0  0 0 0 | 
| 0  1.41421 0 0 0 | 
| 0  0  0 0 0 | 
| 0  0  0 0 0 | 
| 0  0  0 0 0 | 

然而,再考慮這件事後,我認爲你的鄰接矩陣的SVD不會直接給你,你找什麼對於。您必須以某種方式定義節點實際上在您的上下文中的內容。

Edit2(回覆下面的評論):SVD不會給你關於你的節點的直接信息,而是關於你的矩陣。奇異向量形成一個正交基,它可以用來以不同的形式表達原始矩陣。奇異值爲您提供有關每個矢量的影響有多強的信息。再次,Wikipedia可能會幫助您瞭解如何解釋這一點。回到你原來的問題,我會假設一個簡單的SVD並不真正是你想要的。

+0

感謝您的快速回復,這對我有很大的幫助,我的困惑只在於過程的輸出。 這裏是一個鏈接到一個小的5x5矩陣下面的方法產生的矩陣:http://pastie.org/6195368(道歉的格式,矩陣是相當尷尬的文本)。 'ILRetArray svdOut = ILMath。svd(A,outU,outV);' 基於維基百科文章中的** Range,null space和rank **部分所說的內容,svdOut和矢量矩陣的輸出如何幫助我確定要保留哪些維度以及要丟棄哪些維度? – user1842853 2013-02-16 15:37:57

+0

這真的很有幫助。根據我的理解,SVD有助於減少數據的維度,就像我的鄰接矩陣一樣。我期望的一個「重要」節點將是該矢量具有高特徵值奇異值的節點。在這種奇異值簡單下降的格式中,我不明白它是如何將svdOut *與我的鄰接矩陣A進行比較以確定要移除的維度。你有什麼建議使用SVD來達到這個目的嗎?我對這個目的的線性代數的知識是非常新的,所以如果你認爲我會這樣說錯誤的話! – user1842853 2013-02-16 21:04:23

+0

感謝您的幫助。經過一番思考,現在我更好地理解了SVD,我認爲像光譜聚類或社區檢測這樣的過程將更符合我的需求! – user1842853 2013-02-19 12:28:45