如果人們可以幫助我找到一種有效的方法(可能是低內存算法)來解決以下問題,我將不勝感激。如何找到給定特徵值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()
在某個地方有一個密集的矩陣,這會導致我用完內存,所以如果我可以避免使用完整矩陣,我應該沒問題。
謝謝,我正在嘗試它(忽略我以前的評論,我意識到即使我已經得到了特徵值,它仍然可以是有用的,因爲我確信最大的特徵值已經是1)。 現在我開始我的初始'x'作爲'ones(n,1)/ n'(其中'P'是n乘n),並且重複乘以'P',所以內存需求不會氣球(如果我嘗試了「P」來獲得某種力量,那麼非零元素的數量會迅速增加)。如果它比以前更好,我會報告回來。 – spaceLem
當然,對於一個小案例來說,最大的幾個特徵值是1,.9927,.9818,.9676 ......所以收斂可能需要一段時間。 – spaceLem
最大特徵值HAS爲1(除了數值誤差),或者平衡分佈將爆炸至無窮大或消失至零。請參閱本文中「融合速度」一節:http://en.wikipedia.org/wiki/Markov_chain – Peter