y los vectores propios son conceptos clave en álgebra lineal que también desempeñan un papel importante en la ciencia de datos y el aprendizaje automático. Anteriormente, discutimos cómo se puede realizar la reducción de dimensionalidad con valores propios y vectores propios de la matriz de covarianza.
Hoy vamos a analizar otra aplicación interesante: cómo se pueden utilizar los valores propios y los vectores propios para realizar agrupaciones espectrales, que funcionan bien con estructuras de grupos complejas.
En este artículo, exploraremos cómo los valores propios y los vectores propios hacen posible la agrupación espectral y por qué este método puede superar a las K-medias tradicionales.
Comenzaremos con una visualización simple que le mostrará la importancia de la agrupación espectral y lo motivará a continuar aprendiendo cómo se puede realizar la agrupación espectral con valores propios y vectores propios.
Motivación para la agrupación espectral
Una excelente manera de aprender la agrupación espectral es compararla con un algoritmo de agrupación tradicional como K-means en un conjunto de datos donde K-means tiene dificultades para funcionar bien.
Aquí utilizamos un conjunto de datos de dos lunas generado artificialmente donde los cúmulos son curvos. El algoritmo make_moons de Scikit-learn genera dos lunas en un espacio bidimensional. Luego, utilizamos los algoritmos KMeans y SpectralClustering de Scikit-learn para realizar K-means y agrupación espectral. Finalmente, comparamos las visualizaciones del clúster.
Haciendo datos lunares
# Hacer que los datos de la luna importen matplotlib.pyplot como plt desde sklearn.datasets importe make_moons X, y = make_moons(n_samples=400, noise=0.05, random_state=0) plt.figure(figsize=[4.2, 3]) plt.scatter(X[:,0], X[:,1], s=20) plt.title("Original Datos lunares") plt.savefig("Datos lunares.png")
El conjunto de datos original tiene dos estructuras de cúmulos curvas llamadas lunas. Por eso los llamamos datos lunares.
Aplicación de K-medias a los datos lunares
# Aplicar K-means desde sklearn.cluster import KMeans kmeans = KMeans(n_clusters=2, random_state=0) # Predecir el índice del cluster para cada punto de datos label_kmeans = kmeans.fit_predict(X) # Visualizar clusters plt.figure(figsize=[4.2, 3]) plt.scatter(X[:,0], X[:,1], c=labels_kmeans, s=20) plt.title("Agrupación de K-Means") plt.savefig("K-means.png")
K-means a menudo agrupa incorrectamente los datos de la luna (mezcla incorrectamente los puntos de datos).
Aplicación de agrupamiento espectral a los datos lunares.
# Aplicar agrupación espectral desde sklearn.cluster import SpectralClustering spectral = SpectralClustering(n_clusters=2, affinity='nearest_neighbors', random_state=0) # Predecir el índice de agrupación para cada punto de datos etiquetas_spectral = spectral.fit_predict(X) # Visualizar agrupaciones plt.figure(figsize=[4.2, 3]) plt.scatter(X[:,0], X[:,1], c=labels_spectral, s=20) plt.title("Agrupación espectral") plt.savefig("Spectral.png")
Ahora los puntos de datos están asignados correctamente a las lunas, que se parecen a los datos originales. La agrupación espectral funciona bien en estructuras de agrupaciones complejas. Esto se debe a que los vectores propios de la matriz laplaciana le permiten detectar estructuras de conglomerados complejas.
Hasta ahora, hemos implementado la agrupación espectral utilizando el algoritmo SpectralClustering integrado en Scikit-learn. A continuación, aprenderá cómo implementar la agrupación espectral desde cero. Esto le ayudará a comprender cómo funcionan los valores propios y los vectores propios detrás de escena en el algoritmo.
¿Qué es la agrupación espectral?
La agrupación espectral agrupa puntos de datos en función de sus similitudes en lugar de distancias. Esto le permite revelar estructuras de conglomerados complejas y no lineales sin seguir los supuestos de la agrupación tradicional de k-medias.
La intuición detrás de realizar la agrupación espectral es la siguiente:
Pasos para realizar agrupamiento espectral
Obtener datos Construir la matriz de similitud Construir la matriz de grados Construir la matriz laplaciana (gráfico laplaciano) Encontrar valores propios y vectores propios de la matriz laplaciana. Los vectores propios revelan la estructura del grupo (cómo se agrupan los puntos de datos), actuando como nuevas características, y los valores propios indican la fuerza de la separación del grupo. Seleccione los vectores propios más importantes para incrustar los datos en una dimensión inferior (reducción de dimensionalidad). Aplique K-medias en el nuevo espacio de características (agrupación).
La agrupación espectral combina la reducción de dimensionalidad y la agrupación de K-medias. Incorporamos los datos en un espacio de dimensiones inferiores (donde los grupos son más fáciles de separar) y luego realizamos una agrupación de K-medias en el nuevo espacio de características. En resumen, la agrupación de K-medias funciona en el espacio de características original mientras que la agrupación espectral funciona en el nuevo espacio de características reducido.
Implementación de agrupación espectral: paso a paso
Hemos resumido los pasos para realizar agrupaciones espectrales con valores propios y vectores propios de la matriz laplaciana. Implementemos estos pasos con Python.
1. Obtener datos
Usaremos los mismos datos que usamos anteriormente.
desde sklearn.datasets importe make_moons X, y = make_moons(n_samples=400, ruido=0.05, random_state=0)
2. Construya la matriz de similitud (afinidad)
La agrupación espectral agrupa puntos de datos en función de sus similitudes. Por lo tanto, necesitamos medir la similitud entre los puntos de datos e incluir estos valores en una matriz. Esta matriz se llama matriz de similitud (W). Aquí, medimos la similitud utilizando un núcleo gaussiano.
Si tiene n puntos de datos, la forma de W es (n, n). Cada valor representa similitud entre dos puntos de datos. Los valores más altos en la matriz significan que los puntos son más similares.
desde sklearn.metrics.pairwise importar rbf_kernel W = rbf_kernel(X, gamma=20)
3. Construya la matriz de grados
La matriz de grados (D) contiene la suma de similitudes para cada nodo. Esta es una matriz diagonal y cada valor diagonal muestra la similitud total de ese punto con todos los demás puntos. Todos los elementos fuera de la diagonal son cero. La forma de la matriz de grados también es (n, n).
importar numpy como np D = np.diag(np.sum(W, eje=1))
np.sum(W, axis=1)suma cada fila de la matriz de similitud.
4. Construya la matriz laplaciana
La matriz laplaciana (L) representa la estructura del gráfico de similitud, donde los nodos representan cada punto de datos y los bordes conectan puntos similares. Entonces, esta matriz también se llama gráfico laplaciano y se define de la siguiente manera.
En Python, es
L = D – W
D – W para L garantiza matemáticamente que la agrupación espectral encontrará grupos de puntos de datos que están fuertemente conectados dentro del grupo pero débilmente conectados con otros grupos.
La matriz laplaciana (L) también es una matriz cuadrada (n, n). Esta propiedad es importante para L ya que la descomposición propia se define sólo para matrices cuadradas.
5. Descomposición propia de la matriz laplaciana
La descomposición propia de la matriz laplaciana es el proceso de descomponer (factorizar) esa matriz en valores propios y vectores propios [ref: Descomposición propia de una matriz de covarianza con NumPy]
Si la matriz laplaciana (L) tiene n vectores propios, podemos descomponerla como:
Dónde:
X = matriz de vectores propios Λ = matriz diagonal de valores propios
Las matrices X y Λ se pueden representar de la siguiente manera:
Los vectores x1, x2 y x3 son vectores propios y λ1, λ2 y λ3 son sus correspondientes valores propios.
Los valores propios y los vectores propios vienen en pares. Un par así se conoce como par propio. Entonces, la matriz L puede tener múltiples pares propios [ref: Descomposición propia de una matriz de covarianza con NumPy]
La siguiente ecuación de valores propios muestra la relación entre L y uno de sus pares propios.
Dónde:
L = matriz laplaciana (debe ser una matriz cuadrada) x = vector propio λ = valor propio (factor de escala)
Calculemos todos los pares propios de la matriz laplaciana.
valores propios, vectores propios = np.linalg.eigh(L)
6. Seleccione los vectores propios más importantes.
En la agrupación espectral, el algoritmo utiliza los vectores propios más pequeños de la matriz laplaciana. Entonces, necesitamos seleccionar los más pequeños en la matriz de vectores propios.
Los valores propios más pequeños corresponden a los vectores propios más pequeños. La función eigh() devuelve valores propios y vectores propios en orden ascendente. Entonces, debemos observar los primeros valores del vector de valores propios.
imprimir (valores propios)
Prestamos atención a la diferencia entre valores propios consecutivos. Esta diferencia se conoce como eigengap. Seleccionamos el valor propio que maximiza la brecha propia. Representa el número de conglomerados. Este método se llama heurística de brecha propia.
Según la heurística de brecha propia, el número óptimo de grupos k se selecciona en el punto donde ocurre el mayor salto entre valores propios sucesivos.
Si hay k valores propios muy pequeños, ¡habrá k grupos! En nuestro ejemplo, los dos primeros valores propios pequeños sugieren dos grupos, que es exactamente lo que esperamos. Este es el papel de los valores propios en la agrupación espectral. ¡Son muy útiles para decidir el número de clusters y los vectores propios más pequeños!
Seleccionamos los dos primeros vectores propios correspondientes a estos pequeños valores propios.
k = 2 U = vectores propios[:, :k]
Estos dos vectores propios en la matriz U representan un nuevo espacio de características llamado incrustación espectral, donde los grupos se vuelven linealmente separables. Aquí está la visualización de la incrustación espectral.
importar matplotlib.pyplot como plt plt.figure(figsize=[4.2, 3]) plt.scatter(U[:,0], U[:,1], s=20) plt.title("Incrustación espectral") plt.xlabel("Vector propio 1") plt.ylabel("Vector propio 2") plt.savefig("Incrustación espectral.png")
Este gráfico muestra cómo los vectores propios transforman los datos originales en un nuevo espacio donde los grupos se vuelven linealmente separables.
7. Aplicar K-medias en la incrustación espectral.
Ahora, podemos simplemente aplicar K-medias en incrustación espectral (nuevo espacio vectorial propio) para obtener etiquetas de clúster y luego asignamos esas etiquetas a los datos originales para crear clústeres. K-medias funciona bien aquí porque los grupos son linealmente separables en el nuevo espacio vectorial propio.
importar matplotlib.pyplot como plt desde sklearn.cluster importar KMeans kmeans = KMeans(n_clusters=k) etiquetas_spectral = kmeans.fit_predict(U) # U representa la incrustación espectral plt.figure(figsize=[4.2, 3]) # Asignar etiquetas de clúster a los datos originales plt.scatter(X[:,0], X[:,1], c=labels_spectral, s=20) plt.title("Agrupación espectral") plt.savefig("Manual espectral.png")
¡Esto es lo mismo que obtuvimos de la versión Scikit-learn!
Elegir el valor correcto para gamma
Al crear la matriz de similitud o medir la similitud utilizando un núcleo gaussiano, debemos definir el valor correcto para el hiperparámetro gamma, que controla la rapidez con la que la similitud disminuye con la distancia entre los puntos de datos.
desde sklearn.metrics.pairwise importar rbf_kernel W = rbf_kernel(X, gamma=?)
Para valores de gamma pequeños, la similitud disminuye lentamente y muchos puntos parecen similares. Por lo tanto, esto da como resultado estructuras de clúster incorrectas.
Para valores de gamma grandes, la similitud disminuye muy rápidamente y sólo se conectan puntos muy cercanos. Por lo tanto, los grupos se vuelven muy separados.
Para valores medios, obtendrás racimos equilibrados.
Es mejor probar varios valores, como 0,1, 0,5, 1, 5, 10, 15, y visualizar los resultados de la agrupación para elegir el mejor.
Pensamientos finales
En la agrupación espectral, un conjunto de datos se representa como un gráfico en lugar de una colección de puntos. En ese gráfico, cada punto de datos es un nodo y las líneas (bordes) entre los nodos definen cómo se conectan puntos similares.
El algoritmo de agrupamiento espectral necesita esta representación gráfica en forma matemática. Por eso hemos construido una matriz de similitud (afinidad) (W). Cada valor en esa matriz mide la similitud entre los puntos de datos. Los valores grandes en la matriz significan que dos puntos son muy similares, mientras que los valores pequeños significan que dos puntos son muy diferentes.
A continuación, hemos construido la matriz de grados (D), que es una matriz diagonal donde cada valor diagonal muestra la similitud total de ese punto con todos los demás puntos.
Utilizando la matriz de grados y la matriz de similitud, hemos construido la matriz laplaciana del gráfico, que captura la estructura del gráfico y es esencial para la agrupación espectral.
Hemos calculado los valores propios y los vectores propios de la matriz laplaciana. Los valores propios ayudan a elegir el mejor número de clusters y los vectores propios más pequeños. También indican la fuerza de la separación de los grupos. Los vectores propios revelan la estructura del grupo (límites del grupo o cómo se agrupan los puntos de datos) y se utilizan para obtener un nuevo espacio de características donde los puntos fuertemente conectados en el gráfico se acercan en este espacio. Los grupos se vuelven más fáciles de separar y K-means funciona bien en el nuevo espacio.
Aquí está el flujo de trabajo completo de la agrupación espectral.
Conjunto de datos → Gráfico de similitud → Gráfico laplaciano → Vectores propios → Clústeres
Este es el final del artículo de hoy.
Por favor, hágamelo saber si tiene alguna pregunta o comentario.
Nos vemos en el próximo artículo. ¡Feliz aprendizaje para ti!
Diseñado y escrito por:
Rukshan Pramoditha
2025–03–08