Для матрицы данных размера n-by-p PRINCOMP
вернет матрицу коэффициентов размера p-by-p, где каждый столбец является основным компонентом, выраженным с использованием исходных измерений, поэтому в вашем случае вы создадитевыходная матрица размера:
1036800*1036800*8 bytes ~ 7.8 TB
Попробуйте использовать PRINCOMP(X,'econ')
для возврата только ПК со значительным отклонением
В качестве альтернативы рассмотрите возможность выполнения PCA от SVD : в вашемcase n<<p
, а ковариационную матрицу вычислить невозможно.Следовательно, вместо декомпозиции p-by-p матрицы XX'
достаточно разложить только меньшую n-by-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
Я только что попробовал это на моей машине 4 ГБ, и она работала очень хорошо:
» 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, который включает в себя еще много опций.