Plotar Agrupamento Hierárquico

Beginner

This tutorial is from open-source community. Access the source code

Introdução

O agrupamento aglomerativo é um algoritmo de agrupamento hierárquico que agrupa pontos de dados semelhantes. Ele começa com cada ponto de dados como um cluster separado e, em seguida, combina esses clusters iterativamente com base em sua similaridade até que todos os pontos de dados pertençam a um único cluster. Neste laboratório, exploraremos o efeito de impor um gráfico de conectividade para capturar a estrutura local nos dados.

Dicas da Máquina Virtual

Após o término da inicialização da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação de operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para você.

Importação de Bibliotecas Necessárias

Começaremos importando as bibliotecas necessárias, incluindo numpy, matplotlib e sklearn.

import time
import matplotlib.pyplot as plt
import numpy as np

from sklearn.cluster import AgglomerativeClustering
from sklearn.neighbors import kneighbors_graph

Gerar Dados de Amostra

Geramos dados de amostra criando uma onda senoidal com ruído aleatório.

n_samples = 1500
np.random.seed(0)
t = 1.5 * np.pi * (1 + 3 * np.random.rand(1, n_samples))
x = t * np.cos(t)
y = t * np.sin(t)

X = np.concatenate((x, y))
X += 0.7 * np.random.randn(2, n_samples)
X = X.T

Criar um Grafo

Crie um grafo que capture a conectividade local. Um número maior de vizinhos resultará em clusters mais homogêneos, mas com um custo em tempo de processamento. Um número muito grande de vizinhos resulta em tamanhos de clusters mais distribuídos uniformemente, mas pode não impor a estrutura do manifold local dos dados.

knn_graph = kneighbors_graph(X, 30, include_self=False)

Visualizar Agrupamento sem Conectividade

Visualize o agrupamento sem conectividade plotando os pontos de dados com cores diferentes.

for n_clusters in (30, 3):
    plt.figure(figsize=(10, 4))
    for index, linkage in enumerate(("average", "complete", "ward", "single")):
        plt.subplot(1, 4, index + 1)
        model = AgglomerativeClustering(
            linkage=linkage, connectivity=None, n_clusters=n_clusters
        )
        t0 = time.time()
        model.fit(X)
        elapsed_time = time.time() - t0
        plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
        plt.title(
            "linkage=%s\n(tempo %.2fs)" % (linkage, elapsed_time),
            fontdict=dict(verticalalignment="top"),
        )
        plt.axis("equal")
        plt.axis("off")

        plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
        plt.suptitle(
            "n_cluster=%i, connectivity=%r"
            % (n_clusters, False),
            size=17,
        )

plt.show()

Visualizar Agrupamento com Conectividade

Visualize o agrupamento com conectividade plotando os pontos de dados com diferentes cores.

for n_clusters in (30, 3):
    plt.figure(figsize=(10, 4))
    for index, linkage in enumerate(("average", "complete", "ward", "single")):
        plt.subplot(1, 4, index + 1)
        model = AgglomerativeClustering(
            linkage=linkage, connectivity=knn_graph, n_clusters=n_clusters
        )
        t0 = time.time()
        model.fit(X)
        elapsed_time = time.time() - t0
        plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
        plt.title(
            "linkage=%s\n(tempo %.2fs)" % (linkage, elapsed_time),
            fontdict=dict(verticalalignment="top"),
        )
        plt.axis("equal")
        plt.axis("off")

        plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
        plt.suptitle(
            "n_cluster=%i, connectivity=%r"
            % (n_clusters, True),
            size=17,
        )

plt.show()

Resumo

Neste laboratório, exploramos o efeito de impor um grafo de conectividade para capturar a estrutura local nos dados usando o Agrupamento Hierárquico. Visualizamos o agrupamento com e sem conectividade e observamos que o uso de um grafo de conectividade pode levar a clusters mais estáveis e significativos. Também observamos que um número maior de vizinhos leva a clusters mais homogêneos, à custa de tempo de computação.