Menu
CoddyTech

Modelos aglomerativos

Parte de la sección Aprendizaje no supervisado del Journey de Machine Learning de Coddy. Lección 17 de 51.

Los coches llenan dos aparcamientos, con una fila de coches a lo largo de la carretera que hay entre ellos. Dos formas de agruparlos en 2 clústeres:

Dos gráficos de los mismos 102 coches. Izquierda, enlace Ward: el aparcamiento norte y el aparcamiento sur son dos clústeres de 53 y 49 coches, con la carretera dividida entre ellos. Derecha, enlace simple: un clúster de 101 coches y 1 coche aislado

scikit-learn realiza las fusiones. Indica dónde detenerte con n_clusters:

from sklearn.cluster import AgglomerativeClustering
model = AgglomerativeClustering(n_clusters=2, linkage="ward")
labels = model.fit_predict(X)

linkage determina qué tan separados están dos grupos:

  • "ward", el valor predeterminado: mantiene los grupos compactos
  • "complete": su par más lejano
  • "average": el promedio de todos los pares
  • "single": su par más cercano

Single sigue cadenas: aquí la carretera se traga ambos aparcamientos. Ward forma grupos redondos y uniformes.

challenge icon

Desafío

Intermedio

Las fresas silvestres crecen en tres grupos, además de unas pocas a lo largo de un sendero. ¿Qué enlace encuentra los grupos? plants contiene sus posiciones.

  1. Para cada enlace en linkages, agrupa las plantas en 3 grupos.
  2. Imprime los tamaños de los grupos en una lista, del más grande al más pequeño.
  3. Cuando el grupo más grande contiene más de la mitad de las plantas, añade chained.

Para otro prado:

ward: [40, 38, 31]
complete: [41, 37, 31]
average: [41, 37, 31]
single: [86, 22, 1] chained

Pruébalo tú mismo

import numpy as np
import pandas as pd
from sklearn.cluster import AgglomerativeClustering

# Dónde crecen 109 plantas de fresa silvestre en un prado (metros): tres grupos y un sendero
rng = np.random.default_rng(4)
plants = np.round(np.concatenate([
    rng.normal([2, 3], 0.8, size=(40, 2)),
    rng.normal([9, 4], 1.0, size=(35, 2)),
    rng.normal([6, 10], 0.9, size=(25, 2)),
    np.column_stack([np.linspace(3, 8, 9), np.linspace(3.2, 4, 9)]) + rng.normal(0, 0.15, size=(9, 2)),
]), 2)
linkages = ["ward", "complete", "average", "single"]

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje no supervisado

Practica por tu cuenta: Compilador de Python online