まとめ
- El clustering jerárquico construye un dendrograma que muestra cómo se fusionan las muestras, permitiendo explorar estructuras a distintas escalas.
- En la versión aglomerativa cada punto inicia como clúster propio y se van uniendo pares según un criterio de enlace.
- Las opciones
ward,complete,averageysingle, junto con la métrica de distancia, moldean el resultado. - Visualiza la jerarquía con
scipy.cluster.hierarchyy obtén clústeres planos usandoAgglomerativeClusteringde scikit-learn.
1. Descripción general #
Algoritmo aglomerativo:
- Cada muestra comienza como clúster independiente.
- Se calcula la distancia entre todos los pares de clústeres.
- Se fusiona el par más cercano según la regla elegida y se registra la altura del enlace.
- Se repite hasta formar un único clúster.
Cortar el dendrograma a una altura específica produce una partición con (k) clústeres. Ward suele generar clústeres compactos; single tiende a crear cadenas.
2. Criterios de enlace #
Sean (C_i) y (C_j) clústeres con centroides (\mu_i) y (\mu_j):
- Ward: minimiza el aumento de la varianza intra-clúster $$ \Delta = \frac{|C_i||C_j|}{|C_i| + |C_j|} \lVert \mu_i - \mu_j \rVert^2. $$
- Complete: distancia entre el par de puntos más alejados.
- Average: promedio de todas las distancias cruzadas.
- Single: distancia mínima entre los clústeres (sensible a cadenas).
Escoge el enlace acorde a la forma esperada de los clústeres y escala las variables previamente.
3. Ejemplo en Python #
import numpy as np
from sklearn.datasets import make_blobs
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
X, _ = make_blobs(n_samples=50, centers=3, cluster_std=0.7, random_state=42)
Z = linkage(X, method="ward")
plt.figure(figsize=(8, 4))
dendrogram(Z, truncate_mode="level", p=5)
plt.title("Clustering jerárquico con enlace Ward")
plt.xlabel("índice de muestra o ID de clúster")
plt.ylabel("distancia")
plt.show()
from sklearn.cluster import AgglomerativeClustering
clustering = AgglomerativeClustering(
n_clusters=3,
linkage="average",
affinity="euclidean",
)
labels = clustering.fit_predict(X)
Si prefieres cortar el dendrograma a una altura, especifica distance_threshold y deja n_clusters=None.
4. Referencias #
- Ward, J. H. (1963). Hierarchical Grouping to Optimize an Objective Function. Journal of the American Statistical Association.
- Müllner, D. (2011). Modern Hierarchical, Agglomerative Clustering Algorithms. arXiv:1109.2378.
- scikit-learn developers. (2024). Hierarchical clustering. https://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering