9

我正在尝试使用已标准化的PCA对我的数据应用 PCA。princomp(x)

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

MATLAB 在执行 PCA 时实际上是否内存不足,或者 MATLAB 是否没有充分利用 RAM?任何信息或想法都会有所帮助。(我可能需要增加虚拟内存,但假设 24GB 就足够了。)

4

3 回答 3

20

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

1036800*1036800*8 bytes ~ 7.8 TB

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

或者,考虑通过 SVD 执行 PCA:在您的情况下n<<p,协方差矩阵是不可能计算的。因此,不用分解 p×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

我刚刚在我的 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 回答