我在R中使用princomp
执行PCA。我的数据矩阵很大(10K x 10K,每个值最多4个小数点)。在Xeon 2.27 GHz处理器上需要约3.5个小时和约6.5 GB的物理内存。
由于我只想要前两个组件,因此有没有更快的方法?
更新:
除了速度之外,还有没有一种内存有效的方法可以做到这一点?
使用svd(,2,)
来计算前两个组件大约需要2个小时和6.3 GB的物理内存。
最佳答案
有时您可以使用所谓的“经济”分解,从而可以限制特征值/特征向量的数量。看起来eigen()
和prcomp()
不提供此功能,但是svd()
允许您指定要计算的最大数量。
在小型矩阵上,增益似乎不大:
R> set.seed(42); N <- 10; M <- matrix(rnorm(N*N), N, N)
R> library(rbenchmark)
R> benchmark(eigen(M), svd(M,2,0), prcomp(M), princomp(M), order="relative")
test replications elapsed relative user.self sys.self user.child
2 svd(M, 2, 0) 100 0.021 1.00000 0.02 0 0
3 prcomp(M) 100 0.043 2.04762 0.04 0 0
1 eigen(M) 100 0.050 2.38095 0.05 0 0
4 princomp(M) 100 0.065 3.09524 0.06 0 0
R>
但是从
princomp()
重构princomp()
时,相对于svd()
的3倍可能值得,因为svd()
允许您在两个值之后停止。
关于r - 计算R中前两个主成分的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8299460/