2014-04-09 94 views
1

如果人們可以幫助我找到一種有效的方法(可能是低內存算法)來解決以下問題,我將不勝感激。如何找到給定特徵值1的特徵向量,最大限度地減少內存使用

我需要找到轉換矩陣P的平穩分佈x。轉移矩陣是一個非常大的,極其稀疏矩陣,構造爲使得由於固定分佈由等式給出Px = x所有列總和爲1,然後x是一個簡單的與P特徵值有關的特徵向量1.

我目前使用GNU Octave來生成轉換矩陣,找到平穩分佈並繪製結果。我使用函數eigs()來計算特徵值和特徵向量,並且有可能返回一個特徵向量,其中特徵值是1(爲了防止錯誤,我實際上必須指定1.1)。轉換矩陣(使用稀疏矩陣)的構造相當快,但是當我增加尺寸時發現特徵向量變得越來越慢,並且在我能夠檢查即使是中等大小的問題之前,內存耗盡。

我當前的代碼是

既然我知道1是本徵值,我想知道是否有可以是一個更好的方法來計算的特徵向量,或者使更有效地使用一種方法內存,因爲我並不真的需要一箇中等大型的密集矩陣。我天真地嘗試

n = size(P,1);  % number of states 
Q = P - speye(n,n); 
x = Q\zeros(n,1); % solve (P-I)x = 0 

這失敗,因爲Q是單數(定義)。

如果有人對我應該如何處理這個問題有任何想法,我將非常感激,因爲這是一個計算,我必須執行很多次,並且我想在更大和更復雜的模型上嘗試它if可能。

作爲這個問題的背景,我正在求解一個隨機SIR模型中牛羣感染數量的均衡分佈。不幸的是,即使是中等大小的牛羣,轉換矩陣也非常大。例如:在平均20個人(95%的時間人口在12和28個人之間)的SIR模型中,P是21169到21169,其中20340個非零值(即0.0005%密度),並且用完321 Kb(這個尺寸的全矩陣將是3.3 Gb),而對於大約50個人,P使用3 Mb。 x本身應該很小。我懷疑eigs()在某個地方有一個密集的矩陣,這會導致我用完內存,所以如果我可以避免使用完整矩陣,我應該沒問題。

回答

2

功率迭代是找到矩陣的主要特徵值的標準方法。你選擇一個隨機矢量v,然後重複用P重複它,直到你不再看到它變化非常多。你想定期將v除以sqrt(v^T v)以使其正常化。

這裏的收斂速度與最大特徵值和第二大特徵值之間的間隔成正比。每次迭代只需要幾次矩陣乘法。

有很多方法可以做到這一點(「PageRank」在這裏搜索是一件好事),可以提高真正巨大的稀疏矩陣的速度,但我不知道它們在這裏是必要的還是有用的。

+0

謝謝,我正在嘗試它(忽略我以前的評論,我意識到即使我已經得到了特徵值,它仍然可以是有用的,因爲我確信最大的特徵值已經是1)。 現在我開始我的初始'x'作爲'ones(n,1)/ n'(其中'P'是n乘n),並且重複乘以'P',所以內存需求不會氣球(如果我嘗試了「P」來獲得某種力量,那麼非零元素的數量會迅速增加)。如果它比以前更好,我會報告回來。 – spaceLem

+0

當然,對於一個小案例來說,最大的幾個特徵值是1,.9927,.9818,.9676 ......所以收斂可能需要一段時間。 – spaceLem

+2

最大特徵值HAS爲1(除了數值誤差),或者平衡分佈將爆炸至無窮大或消失至零。請參閱本文中「融合速度」一節:http://en.wikipedia.org/wiki/Markov_chain – Peter

1

你的方法看起來很不錯。但是,你所稱的x是Q的零空間。如果它支持稀疏矩陣,那麼null(Q)將起作用,但它不會。 Web上有很多東西用於查找稀疏矩陣的零空間。例如:

http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/249467

http://www.mathworks.com/matlabcentral/fileexchange/42922-null-space-for-sparse-matrix/content/nulls.m

http://www.mathworks.com/matlabcentral/fileexchange/11120-null-space-of-a-sparse-matrix

+0

謝謝,我會看看那些。現在我正在嘗試其他建議,但是這對於長期解決方案來說可能會更好(對於我的線性代數技能來說,這是一個有用的工作!)。 – spaceLem

1

看來最好的解決辦法是使用冪迭代方法,通過tmyklebu的建議。

該方法是迭代x = Px; x /= sum(x),直到x收斂。如果連續迭代之間的d1範數小於1e-5,我假設收斂,因爲這似乎給出了很好的結果。

收斂可能需要一段時間,因爲最大的兩個特徵值相當接近(收斂所需的迭代次數可能會有很大的變化,從200到2000左右取決於所用的模型和種羣大小,但它會在結束)。但是,內存要求很低,實現起來非常簡單。

相關問題