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.