Domanda

Sto cercando di applicare PCA sui miei dati utilizzando princomp(x) , che è stato standardizzato

I dati sono <16 x 1036800 double>. Questo corre la nostra memoria, che è troppo prevedibile tranne per il fatto che si tratta di un nuovo computer, il computer contiene 24 GB di RAM per il data mining. MATLAB elenca anche il 24GB disponibile su un controllo della memoria.

Is MATLAB in realtà a corto di memoria durante l'esecuzione di un APC o è MATLAB non si utilizza la RAM per il suo pieno potenziale? Qualsiasi informazione o idee sarebbe utile. (Posso avere bisogno di aumentare la memoria virtuale, ma assunto il 24GB sarebbe stata sufficiente.)

È stato utile?

Soluzione

Per una matrice di dati di dimensione n-by-p, PRINCOMP restituirà una matrice coefficiente di dimensione p-by-p in cui ogni colonna è un componente principale espresso utilizzando le dimensioni originali, quindi nel caso si creerà un'uscita matrice di dimensioni:

1036800*1036800*8 bytes ~ 7.8 TB

Si consiglia di utilizzare PRINCOMP(X,'econ') di restituire solo i PC con significativo scostamento

In alternativa, considerare l'esecuzione APC con SVD : nel tuo caso n<<p, e la matrice di covarianza è impossibile da calcolare. Pertanto, invece di decomposizione della matrice XX' p-by-p, è sufficiente solo decomporre minore n-da-n matrice X'X. Consultare questo carta per riferimento .


EDIT:

Ecco la mia realizzazione, le uscite di questa funzione corrispondono a quelle di PRINCOMP (i primi tre in ogni caso):

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

Ho appena provato sulla mia macchina 4GB, ed è funzionato bene:

» 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              

Aggiornamento:

La funzione princomp divenne sconsigliata a favore della pca introdotto nel R2012b, che comprende molte più opzioni.

Altri suggerimenti

Matlab è hardcoded limitazioni sulle dimensioni della matrice. Vedere questo link . Se pensate che non sta passando su tali limiti, allora probabilmente avete un bug nel codice e in realtà sono.

Mathworks ingegnere Stuart McGarrity registrato un bello webinar rilevamento tecniche di diagnosi e soluzioni comuni. Se stai dati è infatti entro i limiti consentiti, il problema potrebbe essere frammentazione della memoria - che è facilmente risolvibili .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top