2012-05-30 13 views
5

Tengo que escribir un clasificador (modelo de mezcla gaussiano) que utilizo para el reconocimiento de acción humana. Tengo 4 conjuntos de datos de video. Elijo 3 de ellos como conjunto de entrenamiento y 1 de ellos como conjunto de prueba. Antes de aplicar el modelo gm en el conjunto de entrenamiento ejecuto el pca en él.Análisis de componente principal

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

Durante el paso de prueba ¿qué debo hacer? Debería ejecutar una nueva PRINCOMP en los datos de prueba

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

o debería utilizar el pca_coeff que computo de los datos de entrenamiento?

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

Respuesta

7

El clasificador se está entrenando en datos en el espacio definido por los componentes principales de los datos de entrenamiento. No tiene sentido evaluarlo en un espacio diferente; por lo tanto, debe aplicar la misma transformación a los datos de prueba que los datos de entrenamiento, por lo que no calcule un pca_coef diferente.

Incidentemente, si sus datos de prueba se extraen independientemente de la misma distribución que los datos de entrenamiento, entonces para los grupos de entrenamiento y prueba lo suficientemente grandes, los componentes principales deberían ser aproximadamente los mismos.

Un método para elegir cuántos componentes principales utilizar consiste en examinar los valores propios de la descomposición de PCA. Puede obtener estos de la función PRINCOMP así:

[pca_coeff score eigenvalues] = princomp(data); 

La variable eigenvalues será entonces una matriz en donde cada elemento describe la cantidad de varianza explicada por el componente principal correspondiente. Si lo hace:

plot(eigenvalues); 

debería ver que el primer valor propio será el más grande, y van a disminuir rápidamente (esto se llama un "Pedregal Terreno", y debería tener este aspecto: http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif, aunque el uno de mayo tener hasta 800 puntos en lugar de 12).

Es poco probable que los componentes principales con valores propios pequeños correspondientes sean útiles, ya que la varianza de los datos en esas dimensiones es muy pequeña. Muchas personas eligen un valor umbral y luego seleccionan todos los componentes principales donde el valor propio está por encima de ese umbral. Una forma informal de elegir el umbral es mirar el diagrama de Scree y elegir el umbral justo después de que la línea 'nivele' - en la imagen que vinculé anteriormente, un buen valor podría ser ~ 0.8, seleccionando 3 o 4 componentes principales .

IIRC, que podría hacer algo como:

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

para calcular "la proporción de varianza descrito por los datos de baja dimensión".

Sin embargo, como está utilizando los principales componentes para una tarea de clasificación, no puede estar realmente seguro de que un número determinado de PC sea óptimo; la varianza de una característica no indica necesariamente qué tan útil será para la clasificación. Una alternativa para elegir PC con el diagrama de Scree es simplemente intentar la clasificación con varios números de componentes principales y ver cuál es el mejor número empíricamente.

+0

Gracias Richante, su respuesta es clara y útil. Tengo otra duda. ¿Cuántos componentes tengo que usar?Para cada observación, calculo 800 características y estas son las dimensiones de los datos originales. ¿Cuál es la mejor opción para numDimension? ¿Hay alguna fórmula que pueda usar o debería elegirla por resultados experimentales? –

+0

He agregado cierta información a mi respuesta original para describir cómo elegir la cantidad de componentes principales. La respuesta corta es: realmente no hay una buena fórmula, elegir por experimento es probablemente suficiente. – Richante

+0

En cuanto a su última línea de código 'proportion_of_variance = ...', Matlab calcula esto como tal: 'proportion_of_variance = cumsum (autovalores) ./ sum (autovalores)', mitigando la necesidad de esa variable 'k', en su lugar se obtiene un vector y puede hacer un hallazgo para encontrar dónde se alcanza el umbral. – Unapiedra

Cuestiones relacionadas