2012-05-30 6 views
5

Devo scrivere un classificatore (modello di miscela gaussiana) che utilizzo per il riconoscimento dell'azione umana. Ho 4 serie di dati video. Ne scelgo 3 come set di allenamento e 1 come set di test. Prima di applicare il modello gm sul set di allenamento, eseguo il pca su di esso.Analisi componenti principali

pca_coeff=princomp(trainig_data); 
score = training_data * pca_coeff; 
training_data = score(:,1:min(size(score,2),numDimension)); 

Durante la fase di test, cosa devo fare? Devo eseguire un nuovo princomp su dati di test

new_pca_coeff=princomp(testing_data); 
score = testing_data * new_pca_coeff; 
testing_data = score(:,1:min(size(score,2),numDimension)); 

o devo usare il pca_coeff che computo per i dati di formazione?

score = testing_data * pca_coeff; 
testing_data = score(:,1:min(size(score,2),numDimension)); 

risposta

7

Il classificatore viene addestrato sui dati nello spazio definito dai componenti principali dei dati di addestramento. Non ha senso valutarlo in uno spazio diverso, pertanto è necessario applicare la stessa trasformazione ai dati di test come si è fatto per i dati di allenamento, quindi non calcolare un diverso pca_coef.

Incidentalmente, se i dati di test vengono tracciati indipendentemente dalla stessa distribuzione dei dati di allenamento, quindi per un numero sufficiente di training e set di test, i componenti principali dovrebbero essere approssimativamente uguali.

Un metodo per scegliere quanti componenti principali utilizzare comporta l'esame degli autovalori dalla decomposizione PCA. È possibile ottenere questi dalla funzione princomp simili:

[pca_coeff score eigenvalues] = princomp(data); 

La variabile eigenvalues sarà quindi un array in cui ogni elemento descrive la quantità di varianza valutata con il corrispondente componente principale. Se lo fai:

plot(eigenvalues); 

si dovrebbe vedere che il primo autovalore sarà il più grande, e saranno rapidamente diminuire (questo è chiamato un "Ghiaione Plot", e dovrebbe apparire come segue: http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif, anche se il tuo si può avere fino a 800 punti invece di 12).

È improbabile che componenti di principio con piccoli autovalori corrispondenti siano utili, poiché la varianza dei dati in tali dimensioni è così ridotta. Molte persone scelgono un valore di soglia e quindi selezionano tutte le componenti principali in cui l'autovalore è superiore a tale soglia. Un modo informale di scegliere la soglia è di guardare la trama di Scree e scegliere la soglia per essere subito dopo che la linea 'esce di livello' - nell'immagine che ho collegato in precedenza, un buon valore potrebbe essere ~ 0,8, selezionando 3 o 4 componenti principali .

IIRC, si potrebbe fare qualcosa di simile:

proportion_of_variance = sum(eigenvalues(1:k)) ./ sum(eigenvalues); 

per calcolare "la proporzione della varianza descritta dai dati dimensionale basso".

Tuttavia, poiché si utilizzano i componenti principali di un compito di classificazione, si può non essere veramente sicuri che qualsiasi numero particolare di PC è ottimale; la varianza di una funzione non ti dice necessariamente nulla di quanto sarà utile per la classificazione. Un'alternativa alla scelta dei PC con la trama di Scree è solo per provare la classificazione con vari numeri di componenti principali e vedere quale è il numero migliore empiricamente.

+0

Grazie Richante, la tua risposta è chiara e utile. Ho un altro dubbio. Quanti componenti devo usare?Per ogni osservazione computo 800 funzioni e queste sono le dimensioni dei dati originali. Qual è la scelta migliore per numDimension? C'è una formula che posso usare o dovrei sceglierla con risultati sperimentali? –

+0

Ho aggiunto alcune informazioni alla mia risposta originale per descrivere come scegliere il numero di componenti principali. La risposta breve è: non c'è davvero una buona formula, la scelta di un esperimento probabilmente va bene. – Richante

+0

Per quanto riguarda l'ultima riga di codice 'proportion_of_variance = ...', Matlab docs lo calcola come tale: 'proportion_of_variance = cumsum (autovalori) ./ sum (autovalori)', mitigando la necessità di quella variabile 'k', invece si ottiene un vettore e può fare una ricerca per trovare dove viene raggiunta la soglia. – Unapiedra