17

princompPCAを実行するためにRで使用しています。私のデータ マトリックスは巨大です (各値が小数点以下 4 桁までの 10K x 10K)。Xeon 2.27 GHz プロセッサで最大 3.5 時間と最大 6.5 GB の物理メモリが必要です。

最初の 2 つのコンポーネントのみが必要なので、これを行うより速い方法はありますか?

アップデート :

速度に加えて、これを行うためのメモリ効率の良い方法はありますか?

を使用して最初の 2 つのコンポーネントを計算するには、最大 2 時間と最大 6.3 GB の物理メモリが必要svd(,2,)です。

4

8 に答える 8

20

固有値/固有ベクトルの数を制限できる、いわゆる「経済的」分解にアクセスできる場合があります。これは提供されていないように見えますが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> 

ただし、2 つの値の後で停止できるためprincomp()、再構築中には 3 倍の係数を使用する価値があります。princomp()svd()svd()

于 2011-11-28T20:04:20.963 に答える
6

svd」パッケージは、Lanczos アルゴリズムによる切り捨てられた SVD / 固有値分解のルーチンを提供します。これを使用して、最初の 2 つの主成分だけを計算できます。

ここに私が持っています:

> 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 
于 2011-11-29T16:47:48.357 に答える
4

pcaMethods パッケージの nipals アルゴリズムの実装を試しました。デフォルトでは、最初の 2 つの主成分が計算されます。他の提案された方法よりも遅いことが判明しました。

set.seed(42); N <- 10; M <- matrix(rnorm(N*N), N, N)
library(pcaMethods)
library(rbenchmark)
m1 <- pca(M, method="nipals", nPcs=2)
benchmark(pca(M, method="nipals"),
          eigen(M), svd(M,2,0), prcomp(M), princomp(M), order="relative")

                       test replications elapsed relative user.self sys.self
3              svd(M, 2, 0)          100    0.02      1.0      0.02        0
2                  eigen(M)          100    0.03      1.5      0.03        0
4                 prcomp(M)          100    0.03      1.5      0.03        0
5               princomp(M)          100    0.05      2.5      0.05        0
1 pca(M, method = "nipals")          100    0.23     11.5      0.24        0
于 2012-11-28T15:27:12.210 に答える
1

power メソッドは、あなたが望むものかもしれません。まったく難しくないRでコーディングすると、他の回答で提案されているLAPACKコンパイルルーチンを使用するSVDアプローチよりも高速ではないことがわかると思います。

于 2011-11-29T08:23:16.927 に答える
0

ニューラル ネットワーク アプローチを使用して、主成分を見つけることができます。基本的な説明はここにあります。 http://www.heikohoffmann.de/htmlthesis/node26.html

第 1 主成分 y= w1*x1+w2*x2 および第 2 直交成分は、q = w2*x1-w1*x2 として計算できます。

于 2011-11-29T07:43:34.480 に答える
-1

関数を自分で記述して、2 つのコンポーネントで停止することができます。それほど難しくありません。どこかに置いてあるので見つけたら載せます。

于 2011-11-28T17:08:17.890 に答える