Menu
CoddyTech

DBSCAN

Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 20 sur 51.

Ce chapitre repère des groupes de toutes formes, ainsi que les points qui n'appartiennent à aucun groupe. À la fin, tu cartographies les lumières d'une vallée :

Une carte nocturne d'une vallée : une longue ville incurvée, une ville ronde et un petit village, chacun dans sa propre couleur et avec son propre marqueur, ainsi que 10 lumières isolées représentées par des x gris entre eux

D'abord, les bancs de sable des phoques qui ont mis k-means en échec dans Quand k-means échoue. DBSCAN suit plutôt les groupes :

Deux graphiques représentant les mêmes 200 phoques sur deux bancs de sable incurvés. À gauche, k-means les sépare en une moitié gauche et une moitié droite. À droite, DBSCAN trouve chaque banc de sable intact, avec un petit cercle étiqueté eps autour d'un phoque

Un point ayant min_samples points (lui-même inclus) dans eps, le rayon du cercle, se trouve dans une foule. Les foules s'étendent à travers ces points. Aucun k à choisir :

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

Cela affiche 2 : les foules sont numérotées à partir de 0, donc le plus grand nombre plus un donne leur nombre.

challenge icon

Défi

Moyen

Sur un lac gelé, des patineurs filent le long d’une piste qui serpente entre deux îles, tandis qu’une foule assiste à un match de hockey. k-means découperait la piste en morceaux. Le programme lit eps en mètres.

  1. Ajuste DBSCAN avec cette valeur de eps et min_samples=5 ; conserve les foules dans labels.
  2. Affiche le nombre de foules trouvées.
  3. Représente-les avec draw_crowds(ax, X, labels) et affiche le graphique.

Pour un autre lac et eps 3.5 :

Crowds found: 3

Un graphique intitulé Skaters on the Lake : une piste sinueuse en forme de S comptant 150 patineurs en bleu, une foule ronde de 30 personnes en orange au-dessus de son virage à gauche et un groupe de 22 personnes en vert sous son virage à droite, avec une légende indiquant les effectifs

Coddy décrit ton graphique. Puis exécute-le avec eps 8 : où sont passées les foules ?

Essayez vous-même

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

# Position des 170 patineurs sur le lac gelé, en mètres
skaters = pd.read_csv("skaters.csv")
X = np.column_stack([skaters["x_m"], skaters["y_m"]])
eps = float(input())


# Dessine chaque groupe dans une couleur différente, avec sa taille en légende
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)")

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage non supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne