我有一个密集的实对称方阵。尺寸约为1000x1000。我需要计算第一个主成分,并想知道这样做的最佳算法是什么。
看来MATLAB使用了Arnoldi / Lanczos算法(用于eigs
)。但是通过阅读它们,我不确定它们是否比简单的幂迭代有任何优势,因为我的矩阵不是稀疏的,并且我只对第一个特征向量感兴趣。
任何建议在这种情况下最快的算法是什么?
我有一个密集的实对称方阵。尺寸约为1000x1000。我需要计算第一个主成分,并想知道这样做的最佳算法是什么。
看来MATLAB使用了Arnoldi / Lanczos算法(用于eigs
)。但是通过阅读它们,我不确定它们是否比简单的幂迭代有任何优势,因为我的矩阵不是稀疏的,并且我只对第一个特征向量感兴趣。
任何建议在这种情况下最快的算法是什么?
Answers:
最快的方法可能取决于矩阵的频谱和正态性,但在所有情况下,Krylov算法都应严格优于幂迭代。GW Stewart在矩阵算法,第II卷,本征系统的第3章第4章中对此问题进行了很好的讨论:
幂方法基于以下观察结果:如果具有显性本征对,则在u的适度限制下,向量A k u会生成对显性本征向量的越来越精确的近似值。但是,在每个步骤中,幂方法仅考虑单个向量A k u,这等于丢弃包含在先前生成的向量中的信息。事实证明,这些信息是有价值的……”
并且他继续表明,对于第i个对角线值设置为0.95 i(从i = 0算起)的对角矩阵,经过25次迭代,Krylov子空间捕获的主要特征向量比其好八个数量级。功率迭代。
幂迭代是最简单的,但是如上所述,如果矩阵非常不正常,则收敛可能很慢。您会遇到“驼峰”现象,在渐近行为开始之前,序列似乎会发生许多次迭代而发散。
由于矩阵是对称的,因此可以考虑RQI迭代,在对称情况下会产生三次收敛:http : //en.wikipedia.org/wiki/Rayleigh_quotient_iteration。
使Arnoldi或Lanczos迭代非常好的原因(至少在我看来,但我不研究数值线性代数)是因为它们非常通用。通常可以控制它们为您提供哪些特征值,以及获得多少特征值。在对称情况下尤其如此(如果矩阵确定,则更好)。对于对称问题,它们非常可靠。作为黑匣子,它们可以很好地工作,但是它们也很容易接受新的问题信息,例如解决涉及矩阵的系统的能力。