Análisis de componentes principales del kernel (PCA): explicado con un ejemplo

Las técnicas de reducción de dimensionalidad como PCA funcionan maravillosamente cuando los conjuntos de datos son linealmente separables, pero se descomponen en el momento en que aparecen patrones no lineales. Eso es exactamente lo que sucede con conjuntos de datos como dos lunas: PCA aplana la estructura y mezcla las clases.

Kernel PCA soluciona esta limitación asignando los datos a un espacio de características de mayor dimensión donde los patrones no lineales se vuelven linealmente separables. En este artículo, veremos cómo funciona Kernel PCA y usaremos un ejemplo simple para comparar visualmente PCA con Kernel PCA, mostrando cómo un conjunto de datos no lineal que PCA no puede separar se vuelve perfectamente separable después de aplicar Kernel PCA.

El Análisis de Componentes Principales (PCA) es una técnica de reducción de dimensionalidad lineal que identifica las direcciones (componentes principales) a lo largo de las cuales los datos varían más. Funciona calculando combinaciones lineales ortogonales de las características originales y proyectando el conjunto de datos en las direcciones de máxima varianza.

Estos componentes no están correlacionados y están ordenados de modo que los primeros capturan la mayor parte de la información de los datos. PCA es poderoso, pero tiene una limitación importante: solo puede descubrir relaciones lineales en los datos. Cuando se aplica a conjuntos de datos no lineales (como el ejemplo de las “dos lunas”), a menudo no logra separar la estructura subyacente.

Kernel PCA extiende PCA para manejar relaciones no lineales. En lugar de aplicar PCA directamente en el espacio de características original, Kernel PCA primero usa una función del núcleo (como RBF, polinomio o sigmoide) para proyectar implícitamente los datos en un espacio de características de dimensiones superiores donde la estructura no lineal se vuelve linealmente separable.

Luego, la PCA se realiza en este espacio transformado utilizando una matriz de núcleo, sin calcular explícitamente la proyección de dimensiones superiores. Este “truco del kernel” permite que Kernel PCA capture patrones complejos que el PCA estándar no puede capturar.

Ahora crearemos un conjunto de datos que no sea lineal y luego aplicaremos PCA al conjunto de datos.

Generando el conjunto de datos

Generamos un conjunto de datos no lineal de “dos lunas” usando make_moons, que es ideal para demostrar por qué PCA falla y Kernel PCA tiene éxito.

importar matplotlib.pyplot como plt desde sklearn.datasets importar make_moons X, y = make_moons(n_samples=1000, noise=0.02, random_state=123) plt.scatter(X[:, 0]X[:, 1]c=y) plt.mostrar()

Aplicar PCA en el conjunto de datos

de sklearn.decomposition importar PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(X) plt.title(“PCA”) plt.scatter(X_pca[:, 0]X_pca[:, 1]c=y) plt.xlabel(“Componente 1”) plt.ylabel(“Componente 2”) plt.show()

La visualización PCA muestra que los dos cúmulos en forma de luna permanecen entrelazados incluso después de la reducción de dimensionalidad. Esto sucede porque PCA es una técnica estrictamente lineal: solo puede rotar, escalar o aplanar los datos en direcciones rectas de máxima varianza.

Dado que el conjunto de datos de “dos lunas” tiene una estructura no lineal, PCA no puede separar las clases ni desenredar las formas curvas. Como resultado, los datos transformados todavía parecen casi idénticos al patrón original y las dos clases permanecen superpuestas en el espacio proyectado.

Aplicar Kernel PCA en el conjunto de datos

Ahora aplicamos Kernel PCA utilizando un kernel RBF, que asigna los datos no lineales a un espacio de dimensiones superiores donde se vuelven linealmente separables. En el espacio del kernel, las dos clases de nuestro conjunto de datos son linealmente separables. Kernel PCA utiliza una función del kernel para proyectar el conjunto de datos en un espacio de dimensiones superiores, donde es linealmente separable.

de sklearn.decomposition importar KernelPCA kpca = KernelPCA(kernel=”rbf”, gamma=15) X_kpca = kpca.fit_transform(X) plt.title(“Kernel PCA”) plt.scatter(X_kpca[:, 0]X_kpca[:, 1]c=y) plt.mostrar()

El objetivo del PCA (y de la reducción de dimensionalidad en general) no es solo comprimir los datos, sino revelar la estructura subyacente de una manera que preserve una variación significativa. En conjuntos de datos no lineales como el ejemplo de las dos lunas, el PCA tradicional no puede “desplegar” las formas curvas porque solo aplica transformaciones lineales.

Kernel PCA, sin embargo, realiza un mapeo no lineal antes de aplicar PCA, lo que permite que el algoritmo desenrede las lunas en dos grupos claramente separados. Esta separación es valiosa porque hace que las tareas posteriores como la visualización, la agrupación e incluso la clasificación sean mucho más efectivas. Cuando los datos se vuelven separables linealmente después de la transformación, los modelos simples, como los clasificadores lineales, pueden distinguir con éxito entre las clases, algo que sería imposible en el espacio original o transformado por PCA.

Si bien Kernel PCA es potente para manejar conjuntos de datos no lineales, presenta varios desafíos prácticos. El mayor inconveniente es el costo computacional: debido a que se basa en calcular similitudes por pares entre todos los puntos de datos, el algoritmo tiene O(n²) tiempo y complejidad de memoria, lo que lo hace lento y requiere mucha memoria para grandes conjuntos de datos.

Otro desafío es la selección del modelo: elegir el núcleo correcto (RBF, polinomio, etc.) y ajustar parámetros como gamma puede ser complicado y, a menudo, requiere experimentación o experiencia en el dominio.

Kernel PCA también puede ser más difícil de interpretar, ya que los componentes transformados ya no corresponden a instrucciones intuitivas en el espacio de características original. Finalmente, es sensible a los valores faltantes y a los valores atípicos, que pueden distorsionar la matriz del núcleo y degradar el rendimiento.

Consulta los CÓDIGOS COMPLETOS aquí. No dude en consultar nuestra página de GitHub para tutoriales, códigos y cuadernos. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 100.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.

Soy graduado en ingeniería civil (2022) de Jamia Millia Islamia, Nueva Delhi, y tengo un gran interés en la ciencia de datos, especialmente las redes neuronales y su aplicación en diversas áreas.

🙌 Siga MARKTECHPOST: agréguenos como fuente preferida en Google.