Menu
CoddyTech

DBSCAN

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

Este capítulo encuentra grupos de cualquier forma y los puntos que no pertenecen a ninguno. Al final, cartografiarás las luces de un valle:

Un mapa nocturno de un valle: un pueblo alargado y curvo, un pueblo redondo y una pequeña aldea, cada uno con su propio color y marcador, y 10 luces aisladas como marcas x grises entre ellos

Primero, los bancos de arena de las focas que hicieron fallar k-means en Cuando falla K-Means. DBSCAN sigue a los grupos en su lugar:

Dos gráficos de las mismas 200 focas en dos bancos de arena curvos. A la izquierda, k-means las divide en una mitad izquierda y otra derecha. A la derecha, DBSCAN encuentra cada banco de arena completo, con un pequeño círculo etiquetado eps alrededor de una foca

Un punto con min_samples puntos (incluido él mismo) dentro de eps, el radio del círculo, está en una multitud. Las multitudes se extienden a través de esos puntos. No hay que elegir k:

from sklearn.cluster import DBSCAN
labels = DBSCAN(eps=0.2, min_samples=5).fit_predict(X)
print(labels.max() + 1)

Esto imprime 2: las multitudes se numeran desde 0, así que el número más grande más uno las cuenta.

challenge icon

Desafío

Intermedio

En un lago helado, los patinadores recorren una pista que serpentea entre dos islas, y una multitud observa un partido de hockey. k-means dividiría la pista en partes. El programa lee eps en metros.

  1. Ajusta DBSCAN con ese eps y min_samples=5; guarda las multitudes en labels.
  2. Imprime cuántas multitudes encontró.
  3. Dibújalas con draw_crowds(ax, X, labels) y muestra el gráfico.

Para otro lago y eps 3.5:

Crowds found: 3

Un gráfico titulado Patinadores en el lago: una pista serpenteante en forma de S con 150 patinadores en azul, una multitud redonda de 30 en naranja sobre su curva izquierda y un grupo de 22 en verde debajo de su curva derecha, con una leyenda de tamaños

Coddy describe tu gráfico. Después ejecútalo con eps 8: ¿adónde fueron las multitudes?

Pruébalo tú mismo

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

# Posiciones de 170 patinadores sobre el lago helado, en metros
skaters = pd.read_csv("skaters.csv")
X = np.column_stack([skaters["x_m"], skaters["y_m"]])
eps = float(input())


# Dibuja cada grupo con un color propio y una etiqueta que indica su tamaño
def draw_crowds(ax, X, labels):
    for crowd in range(labels.max() + 1):
        rows = labels == crowd
        ax.scatter(X[rows, 0], X[rows, 1], s=14, label=f"{rows.sum()} skaters")
    ax.legend()


fig, ax = plt.subplots()
ax.set_title("Skaters on the Lake")
ax.set_xlabel("East (m)")
ax.set_ylabel("North (m)")

# 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