È necessario normalizzare i dati prima di eseguire PCA. Ad esempio, considera la seguente situazione. Creo un data set X
con una nota matrice di correlazione C
:
>> C = [1 0.5; 0.5 1];
>> A = chol(rho);
>> X = randn(100,2) * A;
Se ora effettuo PCA, ho correttamente trovare che i componenti principali (le righe dei pesi vettore) sono orientati ad angolo agli assi coordinati :
>> wts=pca(X)
wts =
0.6659 0.7461
-0.7461 0.6659
Se ora mi scala la prima caratteristica del set di dati da 100, intuitivamente pensiamo che i componenti principali non dovrebbe cambiare:
>> Y = X;
>> Y(:,1) = 100 * Y(:,1);
Tuttavia, ora trovano che i componenti principali sono allineati con gli assi coordinati:
>> wts=pca(Y)
wts =
1.0000 0.0056
-0.0056 1.0000
Per risolvere questo, ci sono due opzioni. In primo luogo, ho potuto ridimensionare i dati:
>> Ynorm = bsxfun(@rdivide,Y,std(Y))
(La strana bsxfun
la notazione è usato per fare vettore-matrice aritmetica in Matlab - tutto quello che sto facendo è sottraendo la media e dividendo per la deviazione standard di ogni caratteristica) .
Ora ottenere risultati sensibili dal PCA:
>> wts = pca(Ynorm)
wts =
-0.7125 -0.7016
0.7016 -0.7125
Sono leggermente diverso per il PCA sui dati originali, perché ora abbiamo garantito che le nostre caratteristiche sono unità di deviazione standard, che non era caso originale.
L'altra alternativa è rappresentata PCA utilizzando la matrice di correlazione dei dati, invece del prodotto esterno:
>> wts = pca(Y,'corr')
wts =
0.7071 0.7071
-0.7071 0.7071
In realtà questo è completamente equivalente alla standardizzazione del data sottraendo la media e dividendo per la deviazione standard. È solo più conveniente. Secondo me dovresti sempre fare questo, a meno che tu non abbia una buona ragione per non farlo (ad esempio, se tu vuoi raccogliere differenze nella variazione di ciascuna caratteristica).