Я пытаюсь применить PCA на свое использование данных princomp(x)
, это было стандартизировано.
Данные <16 x 1036800 double>
. Это выполняет нашу память, которая является также ожидаться за исключением того, что это - новый компьютер, компьютер содержит 24 ГБ RAM для анализа данных. MATLAB даже перечисляет 24 ГБ, доступных на проверке памяти.
В MATLAB на самом деле заканчивается память при выполнении PCA, или разве MATLAB не использует RAM для, он - полный потенциал? Любая информация или идеи были бы полезны. (Я, возможно, должен увеличить виртуальную память, но предположил, что 24 ГБ будут достаточны.)
Для матрицы данных размера n на p, PRINCOMP
вернет матрицу коэффициентов размера p на p, где каждый столбец является главным компонентом, выраженным с использованием исходных размеров, поэтому в вашем В этом случае вы создадите матрицу вывода размером:
1036800*1036800*8 bytes ~ 7.8 TB
Рассмотрите возможность использования PRINCOMP (X, 'econ')
для возврата только ПК со значительной дисперсией
В качестве альтернативы рассмотрите возможность выполнения PCA с помощью SVD : в вашем случае 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
Я только что попробовал это на своей машине с 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, которая включает в себя гораздо больше параметров.
В Matlab жестко заданы ограничения на размер матрицы. См. ссылку . Если вы думаете, что не переходите эти ограничения, то, вероятно, в вашем коде есть ошибка, и она действительно есть.
Инженер Mathworks Стюарт МакГаррити записал хороший веб-семинар , посвященный методам диагностики и общим решениям. Если ваши данные действительно находятся в допустимых пределах, проблема может заключаться в фрагментации памяти, которая легко разрешима .