Agrupamento Hierárquico
Objetivos de Aprendizagem
- Definir linkage single, complete, average, Ward e centroid pela distância entre clusters que cada um minimiza numa fusão.
- Rodar o agrupamento aglomerativo à mão num conjunto pequeno, ler o dendrograma e conferir a tabela de fusões do SciPy.
- Dizer exatamente qual altura de fusão o SciPy reporta para Ward e conferi-la contra um aumento de soma de quadrados calculado diretamente.
- Explicar chaining, inversões e por que Ward precisa de distâncias euclidianas, cada um com uma execução que o mostre.
- Informar o custo de tempo de um método hierárquico junto com o algoritmo que o atinge, e comparar o resultado com o k-means.
Contexto e Motivação
k-means-clustering pede antes de começar, e outro significa nova execução a partir de novos centros iniciais. O agrupamento hierárquico produz uma família aninhada de partições, uma para cada de até 1, numa única execução. Escolher vira escolher onde cortar uma árvore. O preço é que toda fusão é permanente, e que "a distância entre dois clusters" tem várias definições, que dão árvores diferentes nos mesmos dados. A distância entre pontos vem de similarity-and-distance-measures.
Teoria Central
Aglomerativo e divisivo
O agrupamento aglomerativo começa com clusters unitários e funde repetidamente o par de clusters mais próximo, fusões no total. O divisivo começa com tudo num só cluster e vai dividindo. Um primeiro passo divisivo exato precisa avaliar divisões em duas partes não vazias (31 para ), então os métodos divisivos práticos usam alguma heurística. O BisectingKMeans do scikit-learn, por exemplo, divide um cluster por vez com 2-means. O resto desta lição é aglomerativo.
Linkage: a distância entre clusters
Para clusters e com centroides e distância entre pontos :
| Linkage | Distância entre clusters |
|---|---|
| single | |
| complete | |
| average (UPGMA) | |
| centroid (UPGMC) | |
| Ward |
Existem também weighted e median, cujos valores dependem da ordem das fusões. A linha de Ward é a forma que o SciPy reporta, como escrita em Müllner (2011). O critério de Ward é fundir o par que menos aumenta a soma total de quadrados dentro dos clusters, a mesma grandeza com que o k-means trabalha. Para , o aumento tem forma fechada:
Logo, a altura em scipy.cluster.hierarchy.linkage(X, 'ward') é , não . As variantes divergem aqui. O hclust do R tem "ward.D2", que eleva as dissimilaridades ao quadrado antes de atualizar e coincide com o SciPy, e "ward.D", que não faz isso. Murtagh e Legendre (2014) mostram que "ward.D" só implementa o critério de Ward quando recebe distâncias ao quadrado, e que a raiz quadrada dessas alturas coincide então com as de "ward.D2". O AgglomerativeClustering(compute_distances=True) do scikit-learn reporta os mesmos valores do SciPy.
Lendo um dendrograma
Cada nó interno fica na altura da sua fusão. Duas folhas têm distância cofenética igual à altura do seu nó comum mais baixo. Um corte horizontal na altura dá a partição cujos clusters são as subárvores abaixo de . Os dois filhos de um nó podem trocar de lugar livremente, então leia a altura em que dois pontos se juntam, não a proximidade com que suas folhas foram desenhadas.
Quando as alturas nunca diminuem
Propriedade (Müllner 2011). Se, para todos os clusters disjuntos ,
então a sequência de alturas de fusão não pode diminuir. Single, complete, average, weighted e Ward satisfazem isso, e também a propriedade mais forte de redutibilidade, com à direita. Centroid e median não satisfazem, e podem produzir uma inversão, uma fusão mais baixa que a anterior. Um dendrograma com inversão não tem corte horizontal consistente. O Exemplo 4 mostra a condição falhando.
Custo, por algoritmo
O custo é de um algoritmo, não do "agrupamento hierárquico". Todos estes partem de uma matriz de dissimilaridades armazenada, com entradas.
| Algoritmo | Linkages | Tempo |
|---|---|---|
| primitivo: busca em todos os pares a cada fusão | qualquer | |
| baseado em MST | single | |
| nearest-neighbor chain | complete, average, weighted, Ward | |
| genérico com fila de prioridade | qualquer, inclusive centroid e median | melhor caso , cota de pior caso |
Esses valores são de Müllner (2011). A nearest-neighbor chain depende da redutibilidade, então centroid e median não podem usá-la: entre os algoritmos rápidos, só o genérico atende a eles. A documentação do SciPy lista para seu código de MST e de nearest-neighbor chain, para um algoritmo ingênuo em centroid e median, e memória para todos.
Exemplos Resolvidos
Exemplo 1: quatro linkages em seis pontos
Tome pontos numa reta, com todas as execuções no SciPy 1.18:
textA=0 B=1 C=3 D=7 E=8.5 F=14.5
Dois pares de distâncias empatam (6 e 7,5), mas nenhuma decisão de fusão depende deles. As duas primeiras fusões são iguais em todos: em 1, depois em 1,5. Depois entra em , com igual a 2 no single, 3 no complete e 2,5 no average. A saída:
textfusão single complete average Ward 1 A+B 1.0 A+B 1.0 A+B 1.0 A+B 1.0 2 D+E 1.5 D+E 1.5 D+E 1.5 D+E 1.5 3 C+AB 2.0 C+AB 3.0 C+AB 2.5 C+AB 2.8868 4 DE+ABC 4.0 F+DE 7.5 DE+ABC 6.4167 F+DE 7.7942 5 F+resto 6.0 ABC+DEF 14.5 F+resto 10.6 ABC+DEF 15.0111 k=2 ABCDE | F ABC | DEF ABCDE | F ABC | DEF
Confira uma altura do average: . Cortar a árvore do complete em dá , e em dá . Nessa árvore, a distância cofenética de e é 14,5, bem acima da distância entre eles, 8,5.
Exemplo 2: a altura de Ward é
Para cada fusão de Ward acima, calcule diretamente o SSE do cluster fundido e subtraia:
textfusão SSE(união) Delta sqrt(2 Delta) altura scipy SSE acumulado A+B 0.5 0.5 1.0 1.0 0.5 D+E 1.125 1.125 1.5 1.5 1.625 C+AB 4.6667 4.1667 2.8868 2.8868 5.7917 F+DE 31.5 30.375 7.7942 7.7942 36.1667 ABC+DEF 148.8333 112.6667 15.0111 15.0111 148.8333
Todas as alturas batem, e os deltas somam o SSE total dos seis pontos, 148,8333. Assim, Z[:,2]**2/2 somado até uma fusão dá o SSE dentro dos clusters daquele corte. Uma atualização de Lance-Williams como a de "ward.D", rodada sobre distâncias ao quadrado, dá , cujas raízes quadradas são as alturas do SciPy. Sobre distâncias sem elevar ao quadrado, dá , que não batem com nenhuma das duas.
Exemplo 3: chaining no single linkage
Monte 29 pontos: duas grades unitárias , o bloco em e o bloco em , com ; dez pontos de ponte em , espaçados de 0,9, de a ; e um ponto isolado em . Corte cada árvore em :
textlinkage com ponte: tamanhos L e R juntos? sem ponte: tamanhos single 28 + 1 sim 9 + 10 complete 13 + 16 não 9 + 10 average 13 + 16 não 9 + 10 Ward 13 + 16 não 9 + 10
Sem a ponte, todo linkage separa os blocos, e o single tem sua fusão mais alta em 10. Dez pontos em fila derrubam essa fusão para 1, porque o single linkage só olha o par mais próximo, e uma corrente de passos curtos une grupos distantes. Para só resta cortar fora o ponto isolado, na altura 1,5. Os outros linkages mantêm os blocos separados e dividem a ponte em 6 e 4. Chaining só é defeito quando o objetivo são grupos compactos: density-based-clustering-with-dbscan mantém a ideia de seguir pontos conectados e acrescenta um requisito de densidade. Muitas alturas aqui empatam em 1,0, então fcluster(Z, 3, 'maxclust') na árvore do single devolve 2 clusters, não 3: ele não divide dentro de um empate.
Exemplo 4: uma inversão no centroid linkage
Três pontos: , , . Os dois primeiros estão à distância 1, e cada um a do terceiro. Eles se fundem na altura 1, e o centroide deles, , está a apenas do terceiro ponto:
textmétodo alturas is_monotonic centroid 1.0 0.9 False median 1.0 0.9 False average 1.0 1.0296 True Ward 1.0 1.0392 True
A hipótese falha aqui: está abaixo das outras duas distâncias, mas . O nó pai fica abaixo do filho, e fcluster(Z, 0.95, 'distance') devolve três clusters unitários, embora exista um nó em 0,9.
Exemplo 5: Ward precisa de distâncias euclidianas
A fórmula de atualização de Ward supõe entrada euclidiana, porque a forma fechada de supõe. O SciPy recusa linkage(X, 'ward', metric='cityblock'), e o scikit-learn levanta ValueError para metric='manhattan'. Uma matriz condensada pré-calculada não é verificada. Em :
textentrada fusão 2 fusão 3 alturas sqrt(2 Delta) dessas fusões Euclidiana {3º}+{1,2} {4º}+{5º} 3.16 4.08 5.00 5.32 12.40 3.16 4.08 5.00 5.32 12.40 Manhattan, em matriz {3º}+{4º} {5º}+{6º} 4.00 5.00 6.00 8.51 15.84 3.16 4.12 5.10 6.04 12.01
A execução com Manhattan devolve uma árvore sem nenhum aviso, mas suas alturas não são aumento de SSE de coisa alguma, e suas fusões são outras.
Exemplo 6: fusões gulosas contra o k-means
Em , o corte de Ward em é , com SSE 295,67. Força bruta nas 63 divisões dá , com SSE 183,67. A causa é uma fusão inicial. Com os clusters , juntar 16 e 26 custa , menos que 26 com (66,67) ou 16 com (96,33). Essa fusão nunca é desfeita. KMeans(2, n_init=10, random_state=0) chega a 183,67, e nestes dados o k-means iniciado nos centroides de Ward também chega, em 2 iterações.
Equívocos Comuns e Armadilhas
- "As alturas sempre crescem subindo a árvore." Isso só vale sob a condição acima. Centroid e median podem inverter.
- "Um dendrograma é único." Empates o fazem depender da ordem de entrada. Para com complete linkage, o SciPy dá , e para os mesmos pontos listados como dá .
- "O agrupamento hierárquico dispensa decidir ." A árvore adia a decisão para o corte.
cluster-validationtrata disso.
Resumo
O agrupamento aglomerativo faz fusões irreversíveis, e o linkage define o que é "mais próximo". Single segue correntes, complete e Ward preferem grupos compactos, e centroid pode inverter. A altura de Ward no SciPy é , exige entrada euclidiana e tem escala diferente da de outras ferramentas. O tempo é com os algoritmos de MST e nearest-neighbor chain, e a matriz costuma ser o limite. Comparado ao k-means, o método dá todos os de uma vez, sem início aleatório, mas um corte guloso pode ter SSE bem pior que o ótimo.
Documentation Links
- Müllner (2011): Modern hierarchical, agglomerative clustering algorithms
- Murtagh and Legendre (2011, published 2014): Ward's Hierarchical Clustering Method: Clustering Criterion and Agglomerative Algorithm
- SciPy: scipy.cluster.hierarchy.linkage
- R: hclust
- scikit-learn: AgglomerativeClustering
- scikit-learn: BisectingKMeans