【发布时间】:2014-04-09 14:17:11
【问题描述】:
如果人们能帮助我找到一种有效的方法(可能是低内存算法)来解决以下问题,我将不胜感激。
我需要找到转移矩阵P 的平稳分布x。转移矩阵是一个非常大、非常稀疏的矩阵,其构造使得所有列的总和为 1。由于等式Px = x 给出了平稳分布,因此x 只是与特征值相关联的P 的特征向量1.
我目前正在使用 GNU Octave 来生成转换矩阵、找到平稳分布并绘制结果。我正在使用函数eigs(),它计算特征值和特征向量,并且可以只返回一个特征向量,其中特征值为1(我实际上必须指定1.1,以防止出错)。转换矩阵的构造(使用稀疏矩阵)相当快,但是随着大小的增加,找到特征向量变得越来越慢,而且在我检查中等大小的问题之前内存不足。
我当前的代码是
[v l] = eigs(P, 1, 1.01);
x = v / sum(v);
鉴于我知道 1 是特征值,我想知道是否有更好的方法来计算特征向量,或者有一种方法可以更有效地利用内存,因为我并不真的需要一个中间大的密集矩阵。我天真地尝试过
n = size(P,1); % number of states
Q = P - speye(n,n);
x = Q\zeros(n,1); % solve (P-I)x = 0
失败了,因为 Q 是单数(根据定义)。
如果有人对我应该如何处理这个问题有任何想法,我将不胜感激,因为这是一个我必须执行很多次的计算,如果可能的话,我想在更大、更复杂的模型上进行尝试.
作为这个问题的背景,我正在求解随机 SIR 模型中牛群中感染者数量的平衡分布。不幸的是,即使是中等规模的牛群,转换矩阵也非常大。例如:在一个平均有 20 个人的 SIR 模型中(95% 的时间人口在 12 到 28 个人之间),P 是 21169 乘以 21169,有 20340 个非零值(即 0.0005% 密集),以及使用了 321 Kb(该大小的完整矩阵将是 3.3 Gb),而对于大约 50 个人P 使用 3 Mb。 x 本身应该很小。我怀疑eigs() 在某处有一个密集矩阵,这导致我内存不足,所以如果我可以避免使用完整矩阵,我应该没问题。
【问题讨论】:
标签: memory optimization octave eigenvector