Agrupamiento jerárquico ascendente en el conjunto de datos de dígitos

Beginner

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

Introducción

Esta práctica ilustra varias opciones de enlace para el agrupamiento jerárquico ascendente en una representación bidimensional del conjunto de datos de dígitos. El objetivo de esta práctica es mostrar cómo se comportan diferentes estrategias de enlace y no encontrar buenos grupos para los dígitos. Es por eso que el ejemplo se ejecuta en una representación bidimensional.

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.

En ocasiones, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

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

Importar bibliotecas

Comenzamos importando las bibliotecas necesarias para esta práctica. Utilizaremos numpy, matplotlib, manifold y datasets de scikit-learn para realizar el agrupamiento jerárquico ascendente.

import numpy as np
from matplotlib import pyplot as plt
from time import time
from sklearn import manifold, datasets
from sklearn.cluster import AgglomerativeClustering

Cargar y preparar el conjunto de datos

Cargamos el conjunto de datos de dígitos y lo preparamos para el agrupamiento extrayendo los datos y las etiquetas de destino. También establecemos la semilla aleatoria en cero para garantizar la reproducibilidad.

digits = datasets.load_digits()
X, y = digits.data, digits.target
n_samples, n_features = X.shape
np.random.seed(0)

Visualizar el conjunto de datos

Visualizamos el conjunto de datos calculando una representación bidimensional del conjunto de datos de dígitos utilizando manifold.SpectralEmbedding() y trazando el diagrama de dispersión con diferentes marcadores para cada dígito.

def plot_dataset(X_red):
    x_min, x_max = np.min(X_red, axis=0), np.max(X_red, axis=0)
    X_red = (X_red - x_min) / (x_max - x_min)

    plt.figure(figsize=(6, 4))
    for digit in digits.target_names:
        plt.scatter(
            *X_red[y == digit].T,
            marker=f"${digit}$",
            s=50,
            alpha=0.5,
        )

    plt.xticks([])
    plt.yticks([])
    plt.title('Digits Dataset Scatter Plot', size=17)
    plt.axis("off")
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])

print("Computing embedding")
X_red = manifold.SpectralEmbedding(n_components=2).fit_transform(X)
print("Done.")
plot_dataset(X_red)

Agrupamiento jerárquico ascendente con diferentes estrategias de enlace

Realizamos el agrupamiento jerárquico ascendente con diferentes estrategias de enlace: ward, average, complete y single. Establecemos el número de clusters en 10 para todas las estrategias. Luego trazamos los resultados del agrupamiento utilizando diferentes colores para cada dígito.

def plot_clustering(X_red, labels, title=None):
    x_min, x_max = np.min(X_red, axis=0), np.max(X_red, axis=0)
    X_red = (X_red - x_min) / (x_max - x_min)

    plt.figure(figsize=(6, 4))
    for digit in digits.target_names:
        plt.scatter(
            *X_red[y == digit].T,
            marker=f"${digit}$",
            s=50,
            c=plt.cm.nipy_spectral(labels[y == digit] / 10),
            alpha=0.5,
        )

    plt.xticks([])
    plt.yticks([])
    if title is not None:
        plt.title(title, size=17)
    plt.axis("off")
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])

for linkage in ("ward", "average", "complete", "single"):
    clustering = AgglomerativeClustering(linkage=linkage, n_clusters=10)
    t0 = time()
    clustering.fit(X_red)
    print("%s :\t%.2fs" % (linkage, time() - t0))

    plot_clustering(X_red, clustering.labels_, "%s linkage" % linkage)

plt.show()

Resumen

En esta práctica, aprendimos cómo realizar el agrupamiento jerárquico ascendente en el conjunto de datos de dígitos utilizando diferentes estrategias de enlace. También visualizamos el conjunto de datos y los resultados del agrupamiento para cada estrategia. Los resultados muestran que diferentes estrategias de enlace producen diferentes resultados de agrupamiento, y debemos elegir la estrategia que se ajuste mejor a nuestras necesidades.