MATLAB的内存不足但不应该

use*_*362 9 memory matlab linear-algebra out-of-memory pca

我正在尝试使用PCA对我的数据进行princomp(x)标准化.

数据是<16 x 1036800 double>.这运行我们的内存,除了这是一台新计算机,计算机拥有24GB的RAM用于数据挖掘,这是太过预期.MATLAB甚至列出了内存检查中可用的24GB.

MATLAB在执行PCA时实际上是否内存不足,还是MATLAB没有使用RAM来充分发挥它的潜力?任何信息或想法都会有所帮助.(我可能需要增加虚拟内存,但假设24GB已经足够了.)

Amr*_*mro 20

对于大小为n-by-p的数据矩阵,PRINCOMP将返回大小为p-by-p的系数矩阵,其中每列是使用原始维度表示的主要组件,因此在您的情况下,您将创建一个大小为的输出矩阵:

1036800*1036800*8 bytes ~ 7.8 TB
Run Code Online (Sandbox Code Playgroud)

考虑使用PRINCOMP(X,'econ')仅返回具有显着差异的PC

或者,考虑通过SVD执行PCA:在您的情况下n<<p,协方差矩阵无法计算.因此,代替分解p-by-p矩阵XX',仅分解较小的n×n矩阵就足够了X'X.请参阅本文以供参考.


编辑:

这是我的实现,这个函数的输出与PRINCOMP(前三个)的输出相匹配:

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
Run Code Online (Sandbox Code Playgroud)

我只是在我的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              
Run Code Online (Sandbox Code Playgroud)

更新:

princomp功能已被弃用,有利于pca在R2012b 中引入,其中包括更多选项.

  • 对于那些感兴趣的人,请参阅[此解释](http://math.stackexchange.com/a/3871/133)关于PCA和SVD之间关系的Math.SE (2认同)