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.)

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top