MATLAB не хватает памяти, но это не должно быть - PullRequest
9 голосов
/ 05 июля 2010

Я пытаюсь применить PCA к моим данным, используя princomp(x), который был стандартизирован.

Данные <16 x 1036800 double>. Это использует нашу память, что также вполне ожидаемо, за исключением того факта, что это новый компьютер, на котором хранится 24 ГБ ОЗУ для интеллектуального анализа данных. MATLAB даже перечисляет 24 ГБ, доступные для проверки памяти.

Действительно ли у MATLAB не хватает памяти при выполнении PCA, или MATLAB не использует ОЗУ в полной мере? Любая информация или идеи будут полезны. (Возможно, мне потребуется увеличить виртуальную память, но я предположил, что 24 ГБ было бы достаточно.)

Ответы [ 3 ]

20 голосов
/ 05 июля 2010

Для матрицы данных размера 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, который включает в себя еще много опций.

1 голос
/ 05 июля 2010

Matlab имеет жестко ограниченные размеры матрицы.Смотрите эту ссылку .Если вы думаете, что не превышаете эти ограничения, то, возможно, в вашем коде есть ошибка, и на самом деле это так.

0 голосов
/ 05 июля 2010

Инженер Mathworks Стюарт МакГаррити записал замечательный вебинар методы диагностики и общие решения. Если ваши данные действительно находятся в допустимых пределах, проблема может быть в фрагментации памяти, которая легко может быть решена 1004 *.

...