Agrupamiento jerárquico con restricciones de conectividad

Beginner

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

Introducción

Esta práctica demuestra cómo realizar un agrupamiento jerárquico con restricciones de conectividad utilizando la biblioteca Scikit-learn en Python. En el agrupamiento jerárquico, los clusters se forman mediante la fusión o división recursiva basada en la distancia entre ellos. Las restricciones de conectividad se pueden utilizar para restringir la formación de clusters basada en la conectividad entre los puntos de datos, lo que puede resultar en clusters más significativos.

Consejos sobre la VM

Una vez que se haya iniciado 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 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 sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Generar datos

Comenzamos generando el conjunto de datos Swiss Roll utilizando la función make_swiss_roll de Scikit-learn. El conjunto de datos Swiss Roll es un conjunto de datos tridimensional con una forma en espiral.

from sklearn.datasets import make_swiss_roll

n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
## Hacerlo más delgado
X[:, 1] *= 0.5

Agrupamiento jerárquico no estructurado

Realizamos AgglomerativeClustering, que se incluye en el agrupamiento jerárquico sin ninguna restricción de conectividad.

from sklearn.cluster import AgglomerativeClustering

ward = AgglomerativeClustering(n_clusters=6, linkage="ward").fit(X)
label = ward.labels_

Graficar los clusters jerárquicos no estructurados

Graficamos los clusters jerárquicos no estructurados utilizando la librería matplotlib.

import matplotlib.pyplot as plt

fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
    ax1.scatter(
        X[label == l, 0],
        X[label == l, 1],
        X[label == l, 2],
        color=plt.cm.jet(float(l) / np.max(label + 1)),
        s=20,
        edgecolor="k",
    )

Agrupamiento jerárquico estructurado

Definimos los k-vecinos más cercanos con 10 vecinos utilizando la función kneighbors_graph de Scikit-learn.

from sklearn.neighbors import kneighbors_graph

connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)

Volvemos a realizar AgglomerativeClustering con restricciones de conectividad.

ward = AgglomerativeClustering(
    n_clusters=6, connectivity=connectivity, linkage="ward"
).fit(X)
label = ward.labels_

Graficar los clusters jerárquicos estructurados

Graficamos los clusters jerárquicos estructurados utilizando la librería matplotlib.

fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
    ax2.scatter(
        X[label == l, 0],
        X[label == l, 1],
        X[label == l, 2],
        color=plt.cm.jet(float(l) / np.max(label + 1)),
        s=20,
        edgecolor="k",
    )

Resumen

Esta práctica mostró cómo realizar un agrupamiento jerárquico con restricciones de conectividad utilizando la librería Scikit-learn en Python. Primero generamos el conjunto de datos Swiss Roll y realizamos un agrupamiento jerárquico no estructurado. Luego definimos los k-vecinos más cercanos con 10 vecinos y realizamos un agrupamiento jerárquico estructurado. Finalmente, graficamos tanto los clusters jerárquicos no estructurados como los estructurados utilizando la librería matplotlib.