Agrupamento Hierárquico

2.5.7

Agrupamento Hierárquico

Atualizado 2025-11-05 Leitura 2 min
Resumo
  • 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.hierarchy e extrair clusters planos com o AgglomerativeClustering do 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:

  1. Trate cada amostra como seu próprio cluster.
  2. Encontre o par de clusters com a menor distância segundo a regra de ligação escolhida.
  3. 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()

Dendrograma Ward

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