Aprende clustering espectral desde cero: qué es, cómo funciona paso a paso, implementación en Python con scikit-learn y casos de uso reales en segmentación de imágenes, redes sociales y bioinformática.
1. Introducción
El clustering espectral es una técnica avanzada de machine learning que combina teoría de grafos y álgebra lineal para encontrar patrones complejos en los datos. A diferencia de métodos tradicionales como K-means, el clustering espectral puede manejar datos no-lineales y formas complejas de clusters.
2. ¿Qué es Clustering?
Antes de profundizar en el clustering espectral, entendamos qué es el clustering en general.
2.1 Definición
El clustering es una técnica de aprendizaje no supervisado que agrupa datos similares en clusters (grupos) sin conocer las etiquetas de antemano.
2.2 Tipos de Clustering
Particional
K-means, K-medoids
Jerárquico
Aglomerativo, Divisivo
Basado en Densidad
DBSCAN
Espectral
Nuestro tema principal
2.3 Limitaciones de Métodos Tradicionales
- Asumen que los clusters son esféricos
- No manejan bien datos no-lineales
- Dificultad con clusters de formas complejas
- Sensibles a la inicialización aleatoria
3. Clustering Espectral
El clustering espectral resuelve muchas de estas limitaciones usando la teoría espectral de grafos.
3.1 Conceptos Fundamentales
Matriz de Adyacencia (W)
Representa las similitudes entre puntos de datos. Cada elemento W[i,j] indica qué tan similares son los puntos i y j.
Matriz de Grado (D)
Una matriz diagonal donde D[i,i] es la suma de las similitudes del punto i con todos los demás puntos.
Matriz Laplaciana (L)
Se define como L = D − W. Esta matriz captura la estructura del grafo y es clave para el clustering espectral.
3.2 ¿Por qué Funciona?
- Transforma datos complejos en un espacio donde son más separables
- Usa información global de la estructura de datos
- Puede detectar clusters no-convexos
- Es menos sensible a la forma de los clusters
4. El Algoritmo
El algoritmo de clustering espectral sigue estos pasos de forma ordenada:
Construir el grafo de similitud
Crear la matriz de similitud W entre todos los puntos.
Calcular la Laplaciana
L = D − W, donde D es la matriz de grado diagonal.
Encontrar vectores propios
Calcular los eigenvalues y eigenvectors de la matriz L.
Seleccionar k vectores propios
Tomar los k vectores propios asociados a los k eigenvalues más pequeños.
Clustering en el nuevo espacio
Aplicar K-means sobre la nueva representación de los datos.
4.2 Función de Similitud
La función más común es el kernel gaussiano, que asigna mayor similitud a puntos más cercanos:
W[i,j] = exp(−‖xi − xj‖² / 2σ²)5. Implementación en Python
Vamos a implementar clustering espectral de dos formas: manualmente y usando scikit-learn.
5.1 Importar Librerías
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import SpectralClustering
from sklearn.datasets import make_circles, make_moons
from sklearn.metrics import adjusted_rand_score
import seaborn as sns5.2 Implementación Manual (paso a paso)
def spectral_clustering(X, n_clusters, gamma=1.0):
"""
Implementación manual de clustering espectral
"""
n_samples = X.shape[0]
# 1. Construir matriz de similitud (kernel gaussiano)
W = np.zeros((n_samples, n_samples))
for i in range(n_samples):
for j in range(n_samples):
if i != j:
W[i, j] = np.exp(-gamma * np.linalg.norm(X[i] - X[j])**2)
# 2. Calcular matriz de grado
D = np.diag(np.sum(W, axis=1))
# 3. Calcular matriz Laplaciana
L = D - W
# 4. Encontrar vectores propios
eigenvalues, eigenvectors = np.linalg.eigh(L)
# 5. Seleccionar los k vectores propios más pequeños
indices = np.argsort(eigenvalues)[:n_clusters]
Y = eigenvectors[:, indices]
# 6. Normalizar filas
Y = Y / np.linalg.norm(Y, axis=1, keepdims=True)
# 7. Aplicar K-means en el nuevo espacio
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
labels = kmeans.fit_predict(Y)
return labels5.3 Usando Scikit-learn (recomendado)
# Crear datasets de prueba
X_circles, y_circles = make_circles(
n_samples=300, noise=0.1, factor=0.3, random_state=42
)
X_moons, y_moons = make_moons(
n_samples=300, noise=0.1, random_state=42
)
# Aplicar Clustering Espectral
spectral = SpectralClustering(
n_clusters=2,
gamma=1.0,
affinity='rbf', # kernel gaussiano
random_state=42
)
labels_circles = spectral.fit_predict(X_circles)
labels_moons = spectral.fit_predict(X_moons)
# Evaluar con Adjusted Rand Index
score_circles = adjusted_rand_score(y_circles, labels_circles)
score_moons = adjusted_rand_score(y_moons, labels_moons)
print(f"ARI Círculos: {score_circles:.3f}")
print(f"ARI Lunas: {score_moons:.3f}")6. Ejemplos Prácticos
El clustering espectral demuestra su efectividad en escenarios donde los métodos tradicionales fallan.
6.1 Datos en Círculos Concéntricos
Imagine dos círculos concéntricos de datos. K-means fallaría completamente, dividiendo los datos en mitades horizontales. El clustering espectral, sin embargo, identifica correctamente el círculo interno y externo como grupos separados, independientemente de su posición espacial.
6.2 Datos en Forma de Lunas
Los datos en forma de lunas (dos medias lunas entrelazadas) son un ejemplo clásico donde K-means falla. Mientras K-means crea clusters esféricos incorrectos, el clustering espectral reconoce la estructura no-lineal y agrupa correctamente cada luna como un cluster.
6.3 El Parámetro Gamma
Gamma pequeño
Vecindarios más grandes → clusters más suaves y conectados
Gamma óptimo
Ajuste ideal según la densidad y distribución de los datos
Gamma grande
Vecindarios más pequeños → clusters más definidos y separados
7. Ventajas y Desventajas
✅ Ventajas
- +Maneja clusters no-convexos y formas complejas
- +Considera toda la estructura global de los datos
- +Robusto ante outliers en comparación con K-means
- +Matemáticamente sólido (teoría de grafos)
- +Flexible: diferentes kernels de similitud
⚠️ Desventajas
- −Computacionalmente costoso: O(n³) para n puntos
- −Requiere almacenar la matriz de similitud completa en memoria
- −Sensible a la elección de gamma y número de clusters
- −Escalabilidad limitada: no recomendado para más de 10,000 puntos
¿Cuándo usarlo?
- Datos con clusters de formas complejas (no esféricas)
- Cuando K-means, DBSCAN u otros métodos tradicionales fallan
- Datasets pequeños a medianos (< 10,000 puntos)
- Cuando la estructura global del grafo de similitud es relevante
8. Casos de Uso Reales
Segmentación de Imágenes Médicas
En resonancias magnéticas del cerebro, el clustering espectral distingue entre materia gris, materia blanca y líquido cefalorraquídeo, incluso con formas irregulares e interconectadas.
Análisis de Redes Sociales
Plataformas como LinkedIn usan clustering espectral para detectar comunidades naturales de usuarios basándose en patrones complejos de interacción, no solo en conexiones directas.
Bioinformática y Datos Genómicos
Agrupa genes con patrones de expresión similares para entender enfermedades como el cáncer. Identifica grupos de genes que trabajan juntos en procesos biológicos específicos.
Detección de Fraude Financiero
Identifica patrones complejos en transacciones para detectar comportamientos anómalos y segmentar clientes para marketing personalizado.
Mantenimiento Predictivo Industrial
Agrupa sensores que muestran comportamientos similares para detectar patrones que predicen fallas de equipos antes de que ocurran.
9. Conclusión
El clustering espectral es una técnica poderosa que combina teoría de grafos y álgebra lineal para resolver problemas de clustering complejos. Aunque computacionalmente costoso, ofrece ventajas significativas sobre métodos tradicionales cuando se trabaja con datos de estructura no-lineal.
Puntos Clave a Recordar
- Usa información global de la estructura de datos, no solo distancias locales
- Excelente para clusters no-convexos donde K-means falla
- Requiere ajuste cuidadoso del parámetro gamma
- Mejor para datasets pequeños a medianos (< 10k puntos)
- Combina elegantemente teoría de grafos y álgebra lineal
Próximos Pasos
- Experimentar con diferentes kernels de similitud (coseno, polinomial)
- Probar el algoritmo en tus propios datasets
- Explorar clustering espectral normalizado (Shi & Malik, Ng & Jordan)
- Investigar métodos escalables como Nyström approximation