9

標準化されたを使用して、データにPCAを適用しようとしprincomp(x)ています。

データは<16 x 1036800 double>. これは、これが新しいコンピューターであるという事実を除いて、あまりにも予想されるメモリを実行します。コンピューターはデータマイニング用に 24GB の RAM を保持します。MATLAB は、メモリ チェックで使用可能な 24GB を一覧表示します。

PCA の実行中に MATLAB が実際にメモリ不足になっているのか、それとも MATLAB が RAM を最大限に活用していないのか? どんな情報やアイデアも役に立ちます。(仮想メモリを増やす必要があるかもしれませんが、24GB で十分だと思います。)

4

3 に答える 3

20

サイズnxpのデータ行列の場合、PRINCOMPはサイズp x pの係数行列を返します。ここで、各列は元の次元を使用して表現された主成分であるため、この場合、サイズの出力行列を作成します。

1036800*1036800*8 bytes ~ 7.8 TB

PRINCOMP(X,'econ')大幅な差異のあるPCのみを返すために使用することを検討してください

あるいは、SVDによってPCAを実行することを検討してください:あなたの場合n<<p、共分散行列を計算することは不可能です。したがって、p行p列の行列を分解する代わりにXX'、小さいn行n列の行列のみを分解するだけで十分X'Xです。参考までにこのペーパーを参照してください。


編集:

これが私の実装です。この関数の出力はPRINCOMPの出力と一致します(とにかく最初の3つ):

function [PC,Y,varPC] = pca_by_svd(X)
    % PCA_BY_SVD
    %   X      data matrix of size n-by-p where n<<p
    %   PC     columns are first n principal components
    %   Y      data projected on those PCs
    %   varPC  variance along the PCs
    %

    X0 = bsxfun(@minus, X, mean(X,1));     % shift data to zero-mean
    [U,S,PC] = svd(X0,'econ');             % SVD decomposition
    Y = X0*PC;                             % project X on PC
    varPC = diag(S'*S)' / (size(X,1)-1);   % variance explained
end

4GBのマシンで試してみたところ、問題なく動作しました。

» x = rand(16,1036800);
» [PC, Y, varPC] = pca_by_svd(x);
» whos
  Name             Size                     Bytes  Class     Attributes

  PC         1036800x16                 132710400  double              
  Y               16x16                      2048  double              
  varPC            1x16                       128  double              
  x               16x1036800            132710400  double              

アップデート:

このprincomp関数は非推奨になりpca、R2012bで導入されました。これには、さらに多くのオプションが含まれています。

于 2010-07-05T19:58:20.950 に答える
1

Matlab には、行列のサイズに関するハードコーディングされた制限があります。このリンクを参照してください。これらの制限を超えていないと思われる場合は、おそらくコードにバグがあり、実際にはそうです。

于 2010-07-05T18:55:02.427 に答える
0

Mathworks エンジニアの Stuart McGarrity は、診断テクニックと一般的な解決策を調査す​​る素晴らしいウェビナーを記録しました。データが実際に許容範囲内にある場合、問題はメモリの断片化である可能性があります。これは簡単に解決できます。

于 2010-07-05T19:14:05.393 に答える