В MATLAB заканчивается память, но это не должно быть

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

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

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

9
задан Amro 9 December 2016 в 13:10
поделиться

3 ответа

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

20
ответ дан 4 December 2019 в 10:03
поделиться

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

1
ответ дан 4 December 2019 в 10:03
поделиться

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

0
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: