2.5.7
Agrupamento Hierárquico
- O agrupamento hierárquico cria uma árvore (dendrograma) que mostra como as amostras se fundem, permitindo explorar estruturas de clusters em múltiplas resoluções.
- Na abordagem aglomerativa, cada ponto começa como seu próprio cluster e os pares são fundidos passo a passo de acordo com um critério de ligação.
- As opções de ligação (
ward,complete,average,single) e as métricas de distância (euclidean,cosine, etc.) alteram o formato do dendrograma. - Você pode visualizar a hierarquia com
scipy.cluster.hierarchye extrair clusters planos com oAgglomerativeClusteringdo scikit-learn.
Intuição #
Este método deve ser interpretado por meio de suas suposições, condições dos dados e como as escolhas de parâmetros afetam a generalização.
Explicação Detalhada #
1. Visão geral #
O agrupamento aglomerativo procede da seguinte forma:
- Trate cada amostra como seu próprio cluster.
- Encontre o par de clusters com a menor distância segundo a regra de ligação escolhida.
- Funda o par, registre a altura de fusão e repita até que tudo se torne um único cluster.
Cortar o dendrograma em uma altura específica produz um agrupamento plano. A ligação de Ward tende a produzir clusters compactos, enquanto a ligação simples frequentemente forma clusters em cadeia.
2. Critérios de ligação #
Sejam (C_i) e (C_j) clusters com centroides (\mu_i) e (\mu_j). Regras de ligação comuns:
- Ward: minimiza o aumento na variância intra-cluster $$ \Delta = \frac{|C_i||C_j|}{|C_i| + |C_j|} \lVert \mu_i - \mu_j \rVert^2. $$
- Completa: distância entre o par de pontos mais distante entre clusters.
- Média: distância média par a par entre pontos nos dois clusters.
- Simples: distância entre o par de pontos mais próximo (propenso a encadeamento).
Escolha a regra que corresponda aos formatos que você espera e normalize seus atributos previamente.
3. Exemplo em Python #
O trecho abaixo constrói um dendrograma com SciPy e depois realiza agrupamento aglomerativo com scikit-learn:
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("Hierarchical clustering with Ward linkage")
plt.xlabel("sample index or cluster ID")
plt.ylabel("distance")
plt.show()
from sklearn.cluster import AgglomerativeClustering
clustering = AgglomerativeClustering(
n_clusters=3,
linkage="average",
affinity="euclidean",
)
labels = clustering.fit_predict(X)
Defina distance_threshold em vez de n_clusters se quiser cortar o dendrograma em uma altura personalizada.
4. Referências #
- 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