Matlab – Análisis PCA y reconstrucción de datos multidimensionales

Tengo un gran conjunto de datos multidimensionales (132 dimensiones).

Soy un principiante en la realización de minería de datos y deseo aplicar el análisis de componentes principales mediante el uso de Matlab. Sin embargo, he visto que hay muchas funciones explicadas en la web, pero no entiendo cómo se deben aplicar.

Básicamente, deseo aplicar PCA y obtener los vectores propios y sus autovalores correspondientes a partir de mis datos.

Después de este paso, quiero poder hacer una reconstrucción de mis datos en función de una selección de los vectores propios obtenidos.

Puedo hacerlo manualmente, pero me preguntaba si hay funciones predefinidas que puedan hacer esto porque ya deberían estar optimizadas.

Mi información inicial es algo así como: size(x) = [33800 132] . Así que, básicamente, tengo 132 características (dimensiones) y 33800 puntos de datos. Y quiero realizar PCA en este conjunto de datos.

Cualquier ayuda o pista serviría.

    Aquí hay un recorrido rápido. Primero creamos una matriz de sus variables ocultas (o “factores”). Tiene 100 observaciones y hay dos factores independientes.

     >> factors = randn(100, 2); 

    Ahora crea una matriz de cargas. Esto va a mapear las variables ocultas en sus variables observadas. Supongamos que las variables observadas tienen cuatro características. Entonces su matriz de cargas necesita ser 4 x 2

     >> loadings = [ 1 0 0 1 1 1 1 -1 ]; 

    Eso te dice que la primera carga variable observada en el primer factor, la segunda carga en el segundo factor, la tercera variable carga en la sum de los factores y la cuarta carga variable en la diferencia de los factores.

    Ahora crea tus observaciones:

     >> observations = factors * loadings' + 0.1 * randn(100,4); 

    Agregué una pequeña cantidad de ruido aleatorio para simular un error experimental. Ahora llevamos a cabo la PCA utilizando la función pca desde la caja de herramientas de estadísticas:

     >> [coeff, score, latent, tsquared, explained, mu] = pca(observations); 

    El score variable es el conjunto de puntajes del componente principal. Estos serán ortogonales por construcción, que puedes verificar:

     >> corr(score) ans = 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 

    La score * coeff' combinada score * coeff' reproducirá la versión centrada de sus observaciones. La media mu se resta antes de realizar PCA. Para reproducir tus observaciones originales necesitas agregarlo nuevamente,

     >> reconstructed = score * coeff' + repmat(mu, 100, 1); >> sum((observations - reconstructed).^2) ans = 1.0e-27 * 0.0311 0.0104 0.0440 0.3378 

    Para obtener una aproximación a sus datos originales, puede comenzar a soltar columnas de los componentes principales calculados. Para tener una idea de qué columnas colocar, examinamos la variable explained

     >> explained explained = 58.0639 41.6302 0.1693 0.1366 

    Las entradas le dicen qué porcentaje de la varianza se explica por cada uno de los componentes principales. Podemos ver claramente que los primeros dos componentes son más importantes que los dos segundos (explican más del 99% de la varianza entre ellos). El uso de los primeros dos componentes para reconstruir las observaciones da la aproximación de rango 2,

     >> approximationRank2 = score(:,1:2) * coeff(:,1:2)' + repmat(mu, 100, 1); 

    Ahora podemos intentar trazar:

     >> for k = 1:4 subplot(2, 2, k); hold on; grid on plot(approximationRank2(:, k), observations(:, k), 'x'); plot([-4 4], [-4 4]); xlim([-4 4]); ylim([-4 4]); title(sprintf('Variable %d', k)); end 

    enter image description here

    Obtenemos una reproducción casi perfecta de las observaciones originales. Si quisiéramos una aproximación más aproximada, podríamos simplemente usar el primer componente principal:

     >> approximationRank1 = score(:,1) * coeff(:,1)' + repmat(mu, 100, 1); 

    y trazarlo,

     >> for k = 1:4 subplot(2, 2, k); hold on; grid on plot(approximationRank1(:, k), observations(:, k), 'x'); plot([-4 4], [-4 4]); xlim([-4 4]); ylim([-4 4]); title(sprintf('Variable %d', k)); end 

    enter image description here

    Esta vez la reconstrucción no es tan buena. Eso es porque deliberadamente construimos nuestros datos para tener dos factores, y solo lo estamos reconstruyendo a partir de uno de ellos.

    Tenga en cuenta que a pesar de la similitud sugestiva entre la forma en que construimos los datos originales y su reproducción,

     >> observations = factors * loadings' + 0.1 * randn(100,4); >> reconstructed = score * coeff' + repmat(mu, 100, 1); 

    no hay necesariamente ninguna correspondencia entre los factors y el score , o entre loadings y coeff . El algoritmo PCA no sabe nada sobre la forma en que se construyen sus datos; simplemente trata de explicar la mayor varianza posible con cada componente sucesivo.


    El usuario @Mari preguntó en los comentarios cómo podría trazar el error de reconstrucción en función del número de componentes principales. Usando la variable explained arriba esto es bastante fácil. Generaré algunos datos con una estructura de factores más interesante para ilustrar el efecto:

     >> factors = randn(100, 20); >> loadings = chol(corr(factors * triu(ones(20))))'; >> observations = factors * loadings' + 0.1 * randn(100, 20); 

    Ahora todas las observaciones se cargan sobre un factor común significativo, con otros factores de importancia decreciente. Podemos obtener la descomposición de PCA como antes

     >> [coeff, score, latent, tsquared, explained, mu] = pca(observations); 

    y trazar el porcentaje de varianza explicada de la siguiente manera,

     >> cumexplained = cumsum(explained); cumunexplained = 100 - cumexplained; plot(1:20, cumunexplained, 'x-'); grid on; xlabel('Number of factors'); ylabel('Unexplained variance') 

    enter image description here

    Usted tiene una caja de herramientas de reducción de dimensionalidad bastante buena en http://homepage.tudelft.nl/19j49/Matlab_Toolbox_for_Dimensionality_Reduction.html Además de PCA, esta caja de herramientas tiene muchos otros algoritmos para la reducción de dimensionalidad.

    Ejemplo de hacer PCA:

     Reduced = compute_mapping(Features, 'PCA', NumberOfDimension);