Clustering jerárquico

Basic

Clustering jerárquico | Agrupación con dendrogramas

Creado: Última actualización: Tiempo de lectura: 2 min
まとめ
  • 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, average y single, junto con la métrica de distancia, moldean el resultado.
  • Visualiza la jerarquía con scipy.cluster.hierarchy y obtén clústeres planos usando AgglomerativeClustering de scikit-learn.

1. Descripción general #

Algoritmo aglomerativo:

  1. Cada muestra comienza como clúster independiente.
  2. Se calcula la distancia entre todos los pares de clústeres.
  3. Se fusiona el par más cercano según la regla elegida y se registra la altura del enlace.
  4. 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()

Dendrograma con Ward

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