计算矩阵的特征值有多昂贵?

Posted

技术标签:

【中文标题】计算矩阵的特征值有多昂贵?【英文标题】:How expensive is it to compute the eigenvalues of a matrix? 【发布时间】:2010-10-17 08:46:26 【问题描述】:

最佳算法的复杂度是多少?

如果我有一个 1000 x 1000 的矩阵,实际需要多长时间?我认为如果矩阵稀疏会有帮助?

是否存在特征值计算不会终止的情况?

R 中,我可以计算特征值,如下面的玩具示例:

m<-matrix( c(13,2, 5,4), ncol=2, nrow=2 )
eigen(m, only.values=1)
$values
[1] 14  3

有人知道它使用什么算法吗?

还有其他计算特征值的(开源)包吗?

【问题讨论】:

如果我没记错的话,Google PageRank 的魔力是(至少部分)巨大的特征值计算。很高兴看到他们是如何做到的。我们在数值分析课程中使用 MATLAB 进行幂迭代或 QR 分解。 Google Pagerank 计算对应于一个非常具体的特征值问题:计算与随机矩阵的主要单位特征值相关的特征向量。在这种情况下,会使用一种专门的算法(可能基于幂方法的一些变体)。 【参考方案1】:

特征值计算的大多数算法都可以扩展到 big-Oh(n^3),其中 n 是(对称和方形)矩阵的行/列维度。

要了解迄今为止最佳算法的时间复杂度,您必须参考科学计算/数值方法中的最新研究论文。

但即使您假设最坏的情况,对于 1000x1000 矩阵,您仍然需要至少 1000^3 次操作。

R 默认使用 LAPACK 例程的(DSYEVR、DGEEV、ZHEEV 和 ZGEEV)实现。但是,您可以指定 EISPACK=TRUE 作为参数来使用 EISPACK 的 RS、RG、CH 和 CG 例程。

用于特征值计算的最流行和最优秀的开源包是 LAPACK 和 EISPACK。

【讨论】:

EISPACK 现在已失效并被忽略。见stat.ethz.ch/R-manual/R-devel/library/base/html/eigen.html【参考方案2】:

对于大矩阵,您通常不需要所有特征值。你只希望前几个做(比如说)降维。

规范算法是在 ARPACK 中实现的 Arnoldi-Lanczos 迭代算法:

www.caam.rice.edu/software/ARPACK/

eigs中有matlab接口:

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/eigs.html

eigs(A,k) and eigs(A,B,k) return the k largest magnitude eigenvalues.

现在还有一个 R 接口:

http://igraph.sourceforge.net/doc-0.5/R/arpack.html

【讨论】:

【参考方案3】:

我认为如果矩阵是 稀疏?

是的,有些算法在稀疏矩阵上表现良好。

例如:http://www.cise.ufl.edu/research/sparse/

【讨论】:

是否有寻找特征值的算法?我搜索了一会儿,什么都没有…… @Marak:请参阅 Lanczos、Jacobi-Davidson 和其他迭代方法,如果您只对特征值的子集感兴趣,这些方法会特别有效。【参考方案4】:

如果在实践中可能需要多长时间 我有一个 1000x1000 的矩阵?

MATLAB(基于 LAPACK)在双核 1.83 GHz 机器上在大约 5 秒内计算 1000x1000 随机数的所有特征值。当矩阵是对称的时,计算可以明显更快地完成,并且只需要大约 1 秒。

【讨论】:

【参考方案5】:

我会看看Eigenvalue algorithms,它链接到许多不同的方法。它们都有不同的特征,希望有一个适合您的目的。

【讨论】:

【参考方案6】:

您可以使用来自CRAN 的GuessCompx 包来估计您的特征值计算的经验复杂度并预测完整的运行时间(尽管在您的示例中它仍然很小)。您需要一个小辅助函数,因为拟合过程仅对行进行子集化,因此您必须使矩阵为正方形:

library(GuessCompx)
m = matrix(rnorm(1e6), ncol=1000, nrow=1000)
# custom function  to subset the increasing-size matrix to a square one:
eigen. = function(m) eigen(as.matrix(m[, 1:nrow(m)]))
CompEst(m, eigen.)
#### $`TIME COMPLEXITY RESULTS`
#### $`TIME COMPLEXITY RESULTS`$best.model
#### [1] "CUBIC"
#### $`TIME COMPLEXITY RESULTS`$computation.time.on.full.dataset
#### [1] "5.23S"
#### $`TIME COMPLEXITY RESULTS`$p.value.model.significance
#### [1] 1.784406e-34

您会得到 时间的三次复杂度,以及 R 基础 eigen() 函数的 Nlog(N) 内存复杂度。运行整个计算需要 5.2 秒和 37Mb。

【讨论】:

【参考方案7】:

Apache Mahout 是一个基于 map-reduce 的开源框架(即它适用于非常大的矩阵)。请注意,对于很多矩阵的东西,问题不是“什么是 big-o 运行时”,而是“它的可并行性如何?” Mahout says 他们使用 Lanczos,它基本上可以在您愿意提供的任意数量的处理器上并行运行。

【讨论】:

【参考方案8】:

它使用 QR 算法。参见 Wilkinson, J. H. (1965) 代数特征值问题。克拉伦登出版社,牛津。它没有利用稀疏性。

【讨论】:

以上是关于计算矩阵的特征值有多昂贵?的主要内容,如果未能解决你的问题,请参考以下文章

主成分分析法计算过程中,相关系数矩阵用matlab求出特征值后,如何确定给出的特征值跟各个指标的对应关系

在 Ncuts 实现中查找特征值而不计算距离矩阵

python计算平面的法向-利用协方差矩阵求解特征值和特征向量

矩阵的迹数是矩阵的所有特征值(按照代数重数计算)的和

matlab如何求矩阵特征值

矩阵求特征值 和矩阵求逆 计算复杂度分析, 继续求助