2012-05-30 13 views
5

Ich muss einen Klassifikator (Gauß'sches Mischungsmodell) schreiben, den ich für die Erkennung menschlicher Handlungen verwende. Ich habe 4 Video-Datensätze. Ich wähle 3 von ihnen als Trainingssatz und 1 davon als Testset. Bevor ich das gm-Modell auf dem Trainingssatz anwende, führe ich den PCA darauf aus.Hauptkomponentenanalyse

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

Während des Testschritts was soll ich tun? Sollte ich eine neue princomp auf Testdaten

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

auszuführen oder ich sollte die pca_coeff verwenden, die ich für die Trainingsdaten berechnen?

Antwort

7

Der Klassifikator wird auf Daten in dem durch die Hauptkomponenten der Trainingsdaten definierten Raum trainiert. Es ist nicht sinnvoll, sie in einem anderen Bereich auszuwerten. Daher sollten Sie die gleiche Transformation auf Testdaten anwenden wie auf Trainingsdaten. Berechnen Sie daher keine andere pca_coef.

Wenn Ihre Testdaten unabhängig von der gleichen Verteilung wie die Trainingsdaten erstellt werden, sollten die Hauptkomponenten bei ausreichend großen Trainings- und Testsätzen ungefähr gleich sein.

Eine Methode zur Wahl der Anzahl der zu verwendenden Hauptkomponenten beinhaltet die Untersuchung der Eigenwerte der PCA-Zerlegung. Sie können diese von der princomp Funktion wie diese:

[pca_coeff score eigenvalues] = princomp(data); 

Das eigenvalues Variable wird dann ein Array sein, wobei jedes Element der Menge der Varianz für die durch die entsprechende Hauptkomponente berücksichtigt beschreibt. Wenn Sie das tun:

plot(eigenvalues); 

sollten Sie sehen, dass der erste Eigenwert der größte sein wird, und sie werden schnell abnehmen (das ein „Screeplot“ genannt wird, und sollte wie folgt aussehen: http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif, wenn Ihr kann man haben bis zu 800 Punkte statt 12).

Prinzipkomponenten mit kleinen entsprechenden Eigenwerten sind wahrscheinlich nicht sinnvoll, da die Varianz der Daten in diesen Dimensionen so klein ist. Viele Menschen wählen einen Schwellenwert und wählen dann alle Hauptkomponenten aus, bei denen der Eigenwert über diesem Schwellenwert liegt. Eine informelle Methode zur Auswahl des Schwellenwerts besteht darin, den Scree-Plot zu betrachten und den Schwellenwert so zu wählen, dass die Linie gerade ausläuft. In dem zuvor verlinkten Bild könnte ein guter Wert ~ 0,8 sein, wobei 3 oder 4 Hauptkomponenten ausgewählt werden .

IIRC, könnte man so etwas tun:

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

„der Anteil der Varianz durch die geringen Dimensionsdaten beschrieben“ zu berechnen.

Da Sie jedoch die Hauptkomponenten für eine Klassifizierungsaufgabe verwenden, können Sie nicht wirklich sicher sein, dass eine bestimmte Anzahl von PCs optimal ist. Die Varianz eines Features sagt nicht unbedingt etwas darüber aus, wie nützlich es für die Klassifizierung sein wird. Eine Alternative zur Auswahl von PCs mit dem Scree-Plot besteht lediglich darin, die Klassifizierung mit einer Vielzahl von Hauptkomponenten zu testen und herauszufinden, welche die beste Zahl empirisch ist.

+0

Danke Richante, Ihre Antwort ist klar und nützlich. Ich habe noch einen Zweifel. Wie viele Komponenten muss ich verwenden?Für jede Beobachtung berechne ich 800 Features und dies sind die Dimensionen der Originaldaten. Was ist die beste Wahl für die numDimension? Gibt es eine Formel, die ich verwenden kann oder sollte ich sie durch experimentelle Ergebnisse wählen? –

+0

Ich habe meiner ursprünglichen Antwort einige Informationen hinzugefügt, um zu beschreiben, wie die Anzahl der Hauptkomponenten zu wählen ist. Die kurze Antwort ist: Es gibt nicht wirklich eine gute Formel, die Auswahl durch Experiment ist wahrscheinlich in Ordnung. – Richante

+0

In Bezug auf Ihre letzte Codezeile 'proportion_der_varianz = ...', berechnet Matlab dies als solches: 'proportional_of_variance = cumsum (Eigenwerte) ./ sum (Eigenwerte)', was die Notwendigkeit für diese 'k'-Variable verringert, stattdessen erhalten Sie ein Vektor und kann eine Suche durchführen, um zu finden, wo der Schwellenwert erreicht ist. – Unapiedra