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()让你后两个值停止.
所述"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)