¿Cuántos componentes principales tomar?


Sé que el análisis de componentes principales hace un SVD en una matriz y luego genera una matriz de valores propios. Para seleccionar los componentes principales tenemos que tomar solo los primeros valores propios. Ahora, ¿cómo decidimos sobre el número de valores propios que debemos tomar de la matriz de valores propios?

Author: London guy, 2012-08-22

6 answers

Para decidir cuántos valores propios/vectores propios mantener, debe considerar su razón para hacer PCA en primer lugar. ¿Lo está haciendo para reducir los requisitos de almacenamiento, para reducir la dimensionalidad de un algoritmo de clasificación, o por alguna otra razón? Si no tiene restricciones estrictas, le recomiendo trazar la suma acumulativa de valores propios (suponiendo que estén en orden descendente). Si divide cada valor por la suma total de autovalores antes de trazar, entonces su gráfico muestra la fracción de varianza total retenida frente al número de valores propios. La gráfica entonces proporcionará una buena indicación de cuándo llegas al punto de rendimientos decrecientes (es decir, se gana poca varianza al retener valores propios adicionales).

 26
Author: bogatron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-22 13:11:33

No hay una respuesta correcta, está en algún lugar entre 1 y n.

Piense en un componente principal como una calle en una ciudad que nunca ha visitado antes. ¿Cuántas calles debes tomar para conocer el pueblo?

Bueno, obviamente deberías visitar la calle principal (el primer componente), y tal vez algunas de las otras calles grandes también. ¿Necesita visitar cada calle para conocer la ciudad lo suficientemente bien? Probablemente no.

Para conocer la ciudad a la perfección, debe visitar todos los calle. Pero, ¿y si pudieras visitar, digamos 10 de las 50 calles, y tener un 95% de comprensión de la ciudad? ¿Es suficiente?

Básicamente, debe seleccionar suficientes componentes para explicar lo suficiente de la varianza con la que se sienta cómodo.

 14
Author: Neil McGuigan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-07 05:01:17

Hay una serie de heurísticas para eso.

Por ejemplo, tomando los primeros vectores propios de k que capturan al menos el 85% de la varianza total.

Sin embargo, para una alta dimensionalidad, estas heurísticas generalmente no son muy buenas.

 7
Author: Anony-Mousse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-22 08:42:33

Como otros dijeron, no hace daño trazar la varianza explicada.

Si utiliza PCA como paso de preprocesamiento para una tarea de aprendizaje supervisado, debe validar de forma cruzada toda la canalización de procesamiento de datos y tratar el número de dimensión PCA como un hiperparámetro para seleccionar mediante una búsqueda de cuadrícula en la puntuación supervisada final (por ejemplo, puntuación F1 para la clasificación o RMSE para la regresión).

Si la búsqueda de cuadrícula validada cruzada en todo el conjunto de datos es demasiado costosa, pruebe con 2 submuestras, p. ej. uno con el 1% de los datos y el segundo con el 10% y ver si viene con el mismo valor óptimo para las dimensiones de PCA.

 7
Author: ogrisel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-23 13:27:35

Dependiendo de su situación, puede ser interesante definir el error relativo máximo permitido proyectando sus datos en las dimensiones ndim.

Ilustraré esto con un pequeño ejemplo de matlab. Simplemente omita el código si no está interesado en él.

Primero generaré una matriz aleatoria de n muestras (filas) y p entidades que contienen exactamente 100 componentes principales distintos de cero.

n = 200;
p = 119;
data = zeros(n, p);
for i = 1:100
  data = data + rand(n, 1)*rand(1, p);
end

La imagen se verá similar a:

introduzca la descripción de la imagen aquí

Para esta imagen de ejemplo, se puede calcular el error relativo realizado proyectando los datos de entrada a ndim dimensiones de la siguiente manera:

[coeff,score] = pca(data,'Economy',true);

relativeError = zeros(p, 1);
for ndim=1:p
    reconstructed = repmat(mean(data,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)';
    residuals = data - reconstructed;
    relativeError(ndim) = max(max(residuals./data));
end

Trazar el error relativo en función del número de dimensiones (componentes principales) resulta en el siguiente gráfico:

introduzca la descripción de la imagen aquí

Basado en este gráfico, puede decidir cuántos componentes principales debe tener en cuenta. En esta imagen teórica tomando 100 componentes da como resultado una representación exacta de la imagen. Por lo tanto, tomar más de 100 elementos es inútil. Si desea, por ejemplo, un error máximo del 5%, debe tomar aproximadamente 40 componentes principales.

Descargo de responsabilidad : Los valores obtenidos solo son válidos para mis datos artificiales. Por lo tanto, no utilice los valores propuestos ciegamente en su situación, sino realice el mismo análisis y realice un intercambio entre el error que comete y el número de componentes que necesita.

Código referencia

 2
Author: m7913d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 14:42:53

Recomiendo encarecidamente el siguiente artículo de Gavish y Donoho: El Umbral Duro Óptimo para Valores Singulares es 4 / sqrt(3).

Publiqué un resumen más largo de esto en Crossvalided (stats.stackexchange.com). Brevemente, obtienen un procedimiento óptimo en el límite de matrices muy grandes. El procedimiento es muy simple, no requiere ningún parámetro ajustado a mano, y parece funcionar muy bien en la práctica.

Tienen un buen suplemento de código aquí: https://purl.stanford.edu/vg705qn9070

 1
Author: Alex Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:44:13