Menu
CoddyTech

DBSCAN

Parte da seção Aprendizado não supervisionado do Journey de Machine Learning da Coddy. Lição 20 de 51.

Este capítulo encontra agrupamentos de qualquer formato e os pontos que não pertencem a nenhum. Ao final, você mapeia as luzes de um vale:

Um mapa noturno de um vale: uma cidade alongada e curva, uma cidade redonda e uma pequena vila, cada uma com sua própria cor e marcador, e 10 luzes isoladas como marcas x cinzas entre elas

Primeiro, os bancos de areia das focas que fizeram o k-means falhar em Quando o K-Means falha. O DBSCAN segue os grupos em vez disso:

Dois gráficos com as mesmas 200 focas em dois bancos de areia curvos. À esquerda, o k-means as divide em uma metade à esquerda e outra à direita. À direita, o DBSCAN encontra cada banco de areia inteiro, com um pequeno círculo rotulado eps ao redor de uma foca

Um ponto que tenha min_samples pontos (incluindo ele mesmo) dentro de eps, o raio do círculo, faz parte de uma multidão. As multidões se expandem por meio desses pontos. Não é preciso escolher k:

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

Isso imprime 2: as multidões são numeradas a partir de 0, então o maior número mais um é a quantidade delas.

challenge icon

Desafio

Médio

Em um lago congelado, patinadores correm por uma pista que serpenteia entre duas ilhas, enquanto uma multidão assiste a uma partida de hóquei. k-means dividiria a pista em pedaços. O programa lê eps em metros.

  1. Ajuste o DBSCAN com esse eps e min_samples=5; mantenha as multidões em labels.
  2. Imprima quantas multidões ele encontrou.
  3. Desenhe-as com draw_crowds(ax, X, labels) e exiba o gráfico.

Para outro lago e eps 3.5:

Crowds found: 3

Um gráfico intitulado Patinadores no Lago: uma pista sinuosa em forma de S com 150 patinadores em azul, uma multidão redonda de 30 em laranja acima da curva à esquerda e um grupo de 22 em verde abaixo da curva à direita, com uma legenda dos tamanhos

Coddy descreve seu gráfico. Em seguida, execute-o com eps 8: para onde foram as multidões?

Experimente você mesmo

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

# Posições de 170 patinadores no lago congelado, em metros
skaters = pd.read_csv("skaters.csv")
X = np.column_stack([skaters["x_m"], skaters["y_m"]])
eps = float(input())


# Desenha cada grupo com uma cor própria e indica seu tamanho
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)")

# Escreva seu código abaixo
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Aprendizado não supervisionado

Pratique por conta própria: Compilador de Python online