我正在尝试使用已标准化的PCA对我的数据应用princomp(x)
。
数据为<16 x 1036800 double>
。这运行我们的内存,除了这是一台新计算机,计算机拥有24GB的RAM用于数据挖掘,这是太过预期。 MATLAB甚至列出了内存检查中可用的24GB。
MATLAB在执行PCA时实际上是否内存不足,还是MATLAB没有使用RAM来充分发挥它的潜力?任何信息或想法都会有所帮助。 (我可能需要增加虚拟内存,但假设24GB已经足够了。)
答案 0 :(得分:20)
对于大小为n-by-p的数据矩阵,PRINCOMP
将返回大小为p-by-p的系数矩阵,其中每列是使用原始维度表示的主成分,因此在您的情况下,将创建一个大小的输出矩阵:
1036800*1036800*8 bytes ~ 7.8 TB
考虑使用PRINCOMP(X,'econ')
仅返回具有显着差异的PC
或者,考虑执行PCA by SVD:在您的情况下n<<p
,并且无法计算协方差矩阵。因此,代替分解p-by-p矩阵XX'
,仅分解较小的n×n矩阵X'X
就足够了。请参阅this paper以供参考。
这是我的实现,这个函数的输出与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
函数已被弃用,转而使用R2012b中引入的pca
,其中包含更多选项。
答案 1 :(得分:1)
Matlab对矩阵大小有严格的限制。见this link。如果您认为自己没有超出这些限制,那么您的代码中可能存在错误,实际上是。
答案 2 :(得分:0)
Mathworks工程师Stuart McGarrity记录了nice webinar测量诊断技术和常用解决方案。如果您的数据确实在允许的限制范围内,则问题可能是内存碎片 - easily solvable。