计算R中前两个主成分的最快方法是什么?

384*_*X21 17 r eigenvalue eigenvector pca

princomp在R中用来执行PCA.我的数据矩阵很大(10K x 10K,每个值最多4个小数点).在Xeon 2.27 GHz处理器上需要大约3.5小时和~6.5 GB的物理内存.

由于我只想要前两个组件,有没有更快的方法呢?

更新:

除了速度之外,还有一种内存有效的方法吗?

用于计算前两个组件需要大约2小时和~6.3 GB的物理内存svd(,2,).

Dir*_*tel 19

您有时可以访问所谓的"经济"分解,这些分解允许您限制特征值/特征向量的数量.它看起来像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> 
Run Code Online (Sandbox Code Playgroud)

但三个相对的因素princomp()可能是值得的重建princomp()svd()svd()让你后两个值停止.

  • 在rbenchmark包中.还有一个microbenchmark包. (3认同)

Ant*_*kov 6

所述"SVD"包提供例程截断SVD /特征分解经由的Lanczos算法.您可以使用它来计算前两个主要组件.

我在这里:

> library(svd)
> set.seed(42); N <- 1000; M <- matrix(rnorm(N*N), N, N)
> system.time(svd(M, 2, 0))
   user  system elapsed 
  7.355   0.069   7.501 
> system.time(princomp(M))
   user  system elapsed 
  5.985   0.055   6.085 
> system.time(prcomp(M))
   user  system elapsed 
  9.267   0.060   9.368 
> system.time(trlan.svd(M, neig = 2))
   user  system elapsed 
  0.606   0.004   0.614 
> system.time(trlan.svd(M, neig = 20))
   user  system elapsed 
  1.894   0.009   1.910
> system.time(propack.svd(M, neig = 20))
   user  system elapsed 
  1.072   0.011   1.087 
Run Code Online (Sandbox Code Playgroud)