Graficar el agrupamiento jerárquico

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

El agrupamiento jerárquico es un algoritmo de agrupamiento jerárquico que agrupa puntos de datos similares. Comienza con cada punto de datos como un clúster separado y luego combina estos clústeres iterativamente según su similitud hasta que todos los puntos de datos pertenecen a un solo clúster. En este laboratorio, exploraremos el efecto de imponer un gráfico de conectividad para capturar la estructura local en los datos.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no puede automatizarse debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y resolveremos rápidamente el problema para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49062{{"Graficar el agrupamiento jerárquico"}} sklearn/cluster -.-> lab-49062{{"Graficar el agrupamiento jerárquico"}} ml/sklearn -.-> lab-49062{{"Graficar el agrupamiento jerárquico"}} end

Importar las bibliotecas necesarias

Comenzaremos importando las bibliotecas necesarias, incluyendo numpy, matplotlib y sklearn.

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

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

Generar datos de muestra

Generamos datos de muestra creando una onda sinusoidal con ruido aleatorio.

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

Crear un gráfico

Crea un gráfico que captura la conectividad local. Un mayor número de vecinos dará clústeres más homogéneos a costa del tiempo de cálculo. Un número muy grande de vecinos da tamaños de clúster más uniformemente distribuidos pero puede no imponer la estructura local de la variedad de los datos.

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

Visualizar el agrupamiento sin conectividad

Visualiza el agrupamiento sin conectividad trazando los puntos de datos con diferentes colores.

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(time %.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 el agrupamiento con conectividad

Visualiza el agrupamiento con conectividad trazando los puntos de datos con diferentes colores.

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(time %.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()

Resumen

En este laboratorio, exploramos el efecto de imponer un gráfico de conectividad para capturar la estructura local en los datos utilizando el agrupamiento jerárquico. Visualizamos el agrupamiento con y sin conectividad y observamos que utilizar un gráfico de conectividad puede conducir a clústeres más estables y significativos. También observamos que un mayor número de vecinos conduce a clústeres más homogéneos a costa del tiempo de cálculo.