Tengo que escribir un clasificador (modelo de mezcla gaussiana) que utilizo para el reconocimiento de la 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.

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? ¿Debo ejecutar un nuevo princomp en la prueba de datos?

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

¿O debería usar el pca_coeff que calculo para los datos de entrenamiento?

score = testing_data * pca_coeff;
testing_data = score(:,1:min(size(score,2),numDimension));
5
Mario Lepore 30 may. 2012 a las 18:49

1 respuesta

La mejor respuesta

El clasificador está siendo entrenado con 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, debes aplicar la misma transformación a los datos de prueba que aplicaste a los datos de entrenamiento, así que no calcules un pca_coef diferente.

Por cierto, si sus datos de prueba se extraen independientemente de la misma distribución que los datos de entrenamiento, entonces, para conjuntos de entrenamiento y prueba suficientemente grandes, los componentes principales deben ser aproximadamente los mismos.

Un método para elegir cuántos componentes principales utilizar implica examinar los valores propios de la descomposición de PCA. Puede obtenerlos de la función princomp de esta manera:

[pca_coeff score eigenvalues] = princomp(data);

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

plot(eigenvalues);

Debería ver que el primer valor propio será el más grande, y disminuirá rápidamente (esto se llama un "Gráfico de pantalla", y debería verse así: http://www.ats.ucla.edu/stat/SPSS/output/spss_output_pca_5.gif, aunque el tuyo puede tener hasta 800 puntos en lugar de 12).

Es poco probable que los componentes principales con valores propios correspondientes pequeños sean útiles, ya que la varianza de los datos en esas dimensiones es muy pequeña. Muchas personas eligen un valor de 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 gráfico de Scree y elegir el umbral justo después de que la línea se `` nivele ''; en la imagen que vinculé anteriormente, un buen valor podría ser ~ 0.8, seleccionando 3 o 4 componentes principales .

IIRC, podrías hacer algo como:

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

Para calcular "la proporción de varianza descrita por los datos de baja dimensión".

Sin embargo, dado que está utilizando los componentes principales para una tarea de clasificación, no puede estar realmente seguro de que un número particular de PC sea óptimo; la variación de una característica no necesariamente le dice nada sobre cuán útil será para la clasificación. Una alternativa a elegir PC con el gráfico Scree es simplemente probar la clasificación con varios números de componentes principales y ver cuál es el mejor número empíricamente.

8
Richante 31 may. 2012 a las 17:16
Gracias Richante, tu respuesta es clara y útil. Tengo otra duda. ¿Cuántos componentes tengo que utilizar? 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? ¿Existe una fórmula que pueda usar o debo elegirla por resultados experimentales?
 – 
Mario Lepore
30 may. 2012 a las 20:08
Agregué algo de 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 probablemente esté bien.
 – 
Richante
31 may. 2012 a las 17:19
Con respecto a su última línea de código proportion_of_variance = ..., los documentos de Matlab calculan esto como tal: proportion_of_variance = cumsum(eigenvalues)./sum(eigenvalues), mitigando la necesidad de esa variable k, en su lugar, obtiene un vector y puede hacer una búsqueda para encontrar dónde se alcanza el umbral.
 – 
Unapiedra
28 oct. 2013 a las 19:53