5

重複の可能性:
MATLABはメモリを使い果たしていますが、

膨大なポイントのデータセットに対してPCA分析を実行したいと思います。具体的にsize(dataPoints) = [329150 132]328150、はデータポイント132の数、は機能の数です。

PCA再構成を実行できるように、固有ベクトルとそれに対応する固有値を抽出したいと思います。

ただし、princomp関数を使用している場合(つまり[eigenVectors projectedData eigenValues] = princomp(dataPoints);、次のエラーが発生します:

>> [eigenVectors projectedData eigenValues] = princomp(pointsData);
Error using svd
Out of memory. Type HELP MEMORY for your options.

Error in princomp (line 86)
[U,sigma,coeff] = svd(x0,econFlag); % put in 1/sqrt(n-1) later

ただし、より小さなデータセットを使用している場合は問題ありません。

Matlabのデータセット全体に対してPCAを実行するにはどうすればよいですか?誰かがこの問題に遭遇しましたか?

編集

princomp関数を変更して、のsvds代わりに使用しようとしましsvdたが、ほぼ同じエラーが発生します。私は以下のエラーを落としました:

Error using horzcat
Out of memory. Type HELP MEMORY for your options.

Error in svds (line 65)
B = [sparse(m,m) A; A' sparse(n,n)];

Error in princomp (line 86)
[U,sigma,coeff] = svds(x0,econFlag); % put in 1/sqrt(n-1) later
4

4 に答える 4

5

固有分解に基づく解法

X'X@davidが言ったように、最初にPCAを計算できます。具体的には、以下のスクリプトを参照してください。

sz = [329150 132];
X = rand(sz);

[V D] = eig(X.' * X);

実際にVは、正しい特異ベクトルを保持し、データ ベクトルを行に配置すると主ベクトルを保持します。固有値 はD、各方向間の分散です。標準偏差である特異ベクトルは、分散の平方根として計算されます。

S = sqrt(D);

次に、式 を使用して左特異ベクトルUが計算されX = USV'ます。Uデータ ベクトルが列にある場合は、主成分を参照することに注意してください。

U = X*V*S^(-1);

元のデータ行列を再構築して、L2 再構築エラーを見てみましょう。

X2 = U*S*V';
L2ReconstructionError = norm(X(:)-X2(:))

ほとんどゼロです。

L2ReconstructionError =
  6.5143e-012

データ ベクトルが列にあり、データを固有空間係数に変換する場合は、 を実行する必要がありますU.'*X

このコード スニペットは、私の適度な 64 ビット デスクトップで約 3 秒かかります。

ランダム化された PCA に基づくソリューション

または、ランダム化された PCA に基づくより高速な近似法を使用できます。Cross Validated で私の回答をご覧ください。を使用する代わりに、 を直接計算fsvdして取得することができます。UVeig

データ サイズが大きすぎる場合は、ランダム化された PCA を使用できます。でも、ご指摘のサイズでは前のやり方で十分だと思います。

于 2012-10-03T10:36:35.850 に答える
1

私の推測では、あなたは膨大なデータセットを持っていると思います。すべての svd 係数が必要なわけではありません。この場合、svds代わりにsvd次を使用します。

Matlab ヘルプから直接取得:

 s = svds(A,k) computes the k largest singular values and associated singular vectors of matrix A.

svdあなたの質問から、あなたが直接電話していないことがわかりました。しかし、princomp(編集可能です!) を見て、それを呼び出す行を変更することもできます。

于 2012-10-02T21:18:41.470 に答える
0

おそらく、計算でn x n行列を計算する必要がありました。つまり、次のようになります。

329150 * 329150 * 8btyes ~ 866GB`

メモリエラーが発生する理由を説明するスペースの。pca を計算する効率的な方法があるようprincomp(X, 'econ')です。試してみることをお勧めします。

これについては、stackoverflowmathworksで詳しく説明しています。

于 2012-10-02T23:26:16.423 に答える
0

X'X (132x132) と svd を手動で計算します。または NIPALS スクリプトを見つけます。

于 2012-10-03T00:44:15.937 に答える