Matlab est à court de mémoire, mais il ne devrait pas être
-
02-10-2019 - |
Question
Je suis en train d'appliquer PCA sur mes données à l'aide princomp(x)
, qui a été normalisé
Les données sont <16 x 1036800 double>
. Cela va à notre mémoire qui est trop attendre à l'exception du fait que ce soit un nouvel ordinateur, l'ordinateur contient 24 Go de RAM pour l'exploration de données. Matlab énumère même les 24Go disponibles sur une vérification de la mémoire.
Matlab est en fait à court de mémoire lors de l'exécution d'un PCA ou est Matlab ne pas utiliser la RAM pour son potentiel complet? Toute information ou idées seraient utiles. (Je peux avoir besoin d'augmenter la mémoire virtuelle, mais l'hypothèse 24Go aurait suffi.)
La solution
Pour une matrice de données de taille n par p, PRINCOMP
retourne une matrice de coefficient de taille p par p où chaque colonne est un composant principal exprimé en utilisant les dimensions d'origine, donc dans votre cas, vous allez créer une sortie matrice de taille:
1036800*1036800*8 bytes ~ 7.8 TB
Pensez à utiliser PRINCOMP(X,'econ')
pour renvoyer uniquement les PC avec un écart important
Vous pouvez également envisager d'effectuer PCA par SVD : dans votre cas n<<p
, et matrice de covariance est impossible de calculer. Par conséquent, au lieu de décomposer la matrice p par p XX'
, il suffit de décomposer seulement le plus petit n par n matrice X'X
. Reportez-vous à cet article pour référence .
EDIT:
Voici ma mise en œuvre, les sorties de cette fonction correspondent à celles de PRINCOMP (les trois premiers de toute façon):
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
Je viens d'essayer sur ma machine de 4 Go, et il a couru très bien:
» 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
Mise à jour:
La fonction princomp
devient dépréciée en faveur de pca
introduit dans R2012b, qui comprend beaucoup plus d'options.
Autres conseils
Matlab a hardcoded limitations sur la taille de la matrice. Voir ce lien . Si vous pensez que vous n'êtes pas passer jusqu'à ces limites, alors vous avez probablement un bug dans votre code et sont en fait.
ingénieur Mathworks Stuart McGarrity a enregistré un belle webinaire des techniques de diagnostic d'arpentage et de solutions communes. Si vous les données sont en effet dans les limites autorisées, la question pourrait être la fragmentation de la mémoire - qui est facilement résoluble .