Menu
CoddyTech

DBSCAN

Fa parte della sezione Apprendimento non supervisionato del percorso Machine Learning di Coddy. Lezione 20 di 51.

Questo capitolo individua gruppi di qualsiasi forma e i punti che non appartengono a nessuno. Alla fine, mapperai le luci di una valle:

Una mappa notturna di una valle: una cittadina lunga e curva, una cittadina rotonda e un piccolo villaggio, ognuno con un proprio colore e marcatore, e 10 luci isolate indicate con x grigie tra di loro

Per prima cosa, i banchi di sabbia delle foche che hanno messo in difficoltà k-means in Quando k-means fallisce. DBSCAN segue invece i gruppi:

Due grafici delle stesse 200 foche su due banchi di sabbia curvi. A sinistra, k-means le divide in una metà sinistra e una destra. A destra, DBSCAN individua ciascun banco di sabbia per intero, con un piccolo cerchio etichettato eps attorno a una foca

Un punto con min_samples punti (incluso se stesso) entro eps, il raggio del cerchio, si trova in una folla. Le folle si estendono attraverso questi punti. Non c'è alcun k da scegliere:

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

Questo stampa 2: i gruppi sono numerati a partire da 0, quindi il numero più grande più uno dà il loro totale.

challenge icon

Sfida

Medio

Su un lago ghiacciato, i pattinatori corrono lungo una pista che serpeggia tra due isole, mentre una folla guarda una partita di hockey. k-means dividerebbe la pista in pezzi. Il programma legge eps in metri.

  1. Adatta DBSCAN con quel valore di eps e min_samples=5; conserva le folle in labels.
  2. Stampa quante folle ha trovato.
  3. Disegnale con draw_crowds(ax, X, labels) e mostra il grafico.

Per un altro lago e eps 3.5:

Crowds found: 3

Un grafico intitolato Skaters on the Lake: una pista sinuosa a forma di S con 150 pattinatori in blu, una folla rotonda di 30 persone in arancione sopra la curva a sinistra e un gruppo di 22 in verde sotto la curva a destra, con una legenda delle dimensioni

Coddy descrive il tuo grafico. Poi eseguilo con eps 8: che fine hanno fatto le folle?

Provalo tu

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

# Posizione di 170 pattinatori sul lago ghiacciato, in metri
skaters = pd.read_csv("skaters.csv")
X = np.column_stack([skaters["x_m"], skaters["y_m"]])
eps = float(input())


# Disegna ogni gruppo con un colore diverso, indicando la sua dimensione
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)")

# Scrivi il tuo codice qui sotto
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento non supervisionato

Esercitati da solo: Compilatore Python online