MATLAB è a corto di memoria, ma non dovrebbe essere
-
02-10-2019 - |
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.)
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 .