Red de conocimiento informático - Aprendizaje de programación - Implementación en Python de PCA (Análisis de Componentes Principales)

Implementación en Python de PCA (Análisis de Componentes Principales)

Revisé los pasos de PCA y lo implementé en Python. Descubrí profundamente que los valores propios y vectores propios aprendidos ese año son muy poderosos.

PCA es un método de aprendizaje no supervisado y un método de reducción de dimensionalidad muy común. Con una pérdida mínima de información de datos, el número de características de los datos cambia de n a k(klt;n) al asignarse a otro espacio.

Aquí se utilizan datos bidimensionales para ilustrar PCA. La razón por la que se eligen datos bidimensionales es que son más fáciles de mapear.

Los siguientes son los datos:

Dibuja una gráfica para ver la distribución:

La definición de covarianza es:

Supongamos n está en los datos El número de características, entonces la matriz de covarianza M es una matriz n n, donde Mij es la covarianza de las características i-ésima y j-ésima, y ​​la diagonal es la varianza de cada característica.

En nuestros datos, n = 2, por lo que la matriz de covarianza es 2 2,

A través de numpy, podemos obtener fácilmente:

Obtener la covarianza matriz El resultado de la varianza es:

array([[ 0.61655556, 0.61544444],

[ 0.61544444, 0.71655556]])

Ya que hemos normalizado antes procesamiento, por lo que para nosotros

esta matriz es la matriz transpuesta de datos*datos.

El resultado que obtenemos es:

matriz([[ 5.549, 5.539],

[ 5.539, 6.449] ])

Descubrimos que, de hecho, la matriz de covarianza está estrechamente relacionada con la matriz de dispersión, que es la matriz de covarianza multiplicada (cantidad total de datos - 1). Por tanto, sus raíces propias y vectores propios son los mismos. Una cosa que vale la pena señalar aquí es que la matriz de dispersión es un paso en la descomposición del valor singular de SVD, por lo que PCA y SVD tienen una gran relación. La relación entre ellos no se discutirá en detalle aquí. sobre ello en el futuro.

Calcular raíces propias y vectores propios usando numpy es muy sencillo,

pero lo que representan es muy interesante. Agreguemos los vectores propios al gráfico original:

donde las líneas rojas son los vectores propios. Hay algunos puntos que vale la pena señalar:

El triángulo azul es un nuevo punto obtenido después de la transformación de coordenadas. De hecho, se forma proyectando el origen rojo sobre las líneas roja y azul.

Después de obtener los valores propios y los vectores propios, podemos seleccionar los vectores propios correspondientes a K valores propios de mayor a menor según el tamaño de los valores propios.

La implementación en Python también es muy simple:

Simplemente seleccione los k vectores de características principales de eig_pairs. Aquí solo tenemos dos vectores propios y elegimos el más grande.

Lo principal que hay que hacer es multiplicar los datos originales por una matriz de características que consta de vectores de características filtrados para obtener nuevos datos.

Salida:

De hecho, los datos se han vuelto unidimensionales.

Finalmente, dibujemos un gráfico para ver qué sucede con los datos después de PCA.

Las estrellas verdes de cinco puntas son los datos unidimensionales obtenidos después del procesamiento PCA. Para comparar con la figura anterior, su altura se coloca en 1,2, que en realidad es el punto formado después del punto rojo. se proyecta sobre la línea azul. Esto es PCA. Al seleccionar el vector raíz característico, se forma un nuevo sistema de coordenadas y luego los datos se proyectan en este nuevo sistema de coordenadas para lograr la reducción de dimensionalidad con la menor pérdida de información posible.

A través de los pasos anteriores, simplemente implementamos el primer PCA de procesamiento de datos bidimensional, pero el principio es este: podemos implementar fácilmente la multidimensionalidad en base a esto.

Utilice el PCA de sklearn para comparar con nuestro pca:

Obtenga los resultados:

Pruébelo con nuestro pca

Obtenga los resultados:

Exactamente lo mismo, perfecto~

Vale la pena mencionar que la implementación PCA de sklearn utiliza algunos de los resultados de SVD, y creo que de hecho están muy cerca.