まとめ
- El clustering espectral utiliza el espectro de un grafo de similitud para proyectar los datos a un espacio donde k-means separa fácilmente los clústeres.
- Maneja estructuras no linealmente separables (círculos concéntricos, lunas) al basarse en conectividad.
- Hiperparámetros clave:
affinity(rbf, vecinos más cercanos, coseno),gammaon_neighbors, y el métodoassign_labels. - Tras obtener los (k) primeros eigenvectores del laplaciano normalizado, se normalizan las filas y se aplica k-means.
1. Descripción general #
Dado un matiz de afinidad (W), definimos el laplaciano
$$ L = D - W, \qquad D = \mathrm{diag}(d_i),; d_i = \sum_j W_{ij}, $$
y su versión simétrica normalizada
$$ L_{\mathrm{sym}} = D^{-1/2} L D^{-1/2} = I - D^{-1/2} W D^{-1/2}. $$
Tomamos los (k) eigenvectores asociados a los valores propios más pequeños, formamos la matriz (U), normalizamos cada fila y ejecutamos k-means sobre esas representaciones. Las etiquetas resultantes se asignan a las muestras originales.
2. Ejemplo en Python #
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import make_circles
from sklearn.cluster import SpectralClustering
X, _ = make_circles(n_samples=500, factor=0.4, noise=0.05, random_state=0)
model = SpectralClustering(
n_clusters=2,
affinity="rbf",
gamma=50,
assign_labels="kmeans",
random_state=0,
)
labels = model.fit_predict(X)
plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="coolwarm", s=20)
plt.title("Clustering espectral")
plt.tight_layout()
plt.show()
3. Notas prácticas #
- Usa
affinity="nearest_neighbors"cuando prefieras grafos esparcidos y ajustan_neighbors. assign_labels="cluster_qr"ofrece mayor estabilidad en embeddings de alta dimensión.- Normaliza las características antes de construir el grafo para que
gammatenga sentido.
4. Referencias #
- Shi, J., & Malik, J. (2000). Normalized Cuts and Image Segmentation. IEEE TPAMI.
- Ng, A. Y., Jordan, M. I., & Weiss, Y. (2002). On Spectral Clustering: Analysis and an Algorithm. NeurIPS.
- scikit-learn developers. (2024). Spectral clustering. https://scikit-learn.org/stable/modules/clustering.html#spectral-clustering