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.