Menu
CoddyTech

DBSCAN

Część sekcji Uczenie nienadzorowane ścieżki Machine Learning w Coddy. Lekcja 20 z 51.

W tym rozdziale znajdziesz skupiska o dowolnym kształcie oraz punkty, które nie należą do żadnego z nich. Na jego końcu utworzysz mapę świateł w dolinie:

Nocna mapa doliny: długie, zakrzywione miasteczko, okrągłe miasteczko i mała wioska, każde oznaczone własnym kolorem i znacznikiem, oraz 10 samotnych świateł oznaczonych szarymi krzyżykami pomiędzy nimi

Najpierw ławice fok na piaszczystych łachach, które pokonały k-means w lekcji „Kiedy k-means zawodzi”. DBSCAN podąża za skupiskami fok:

Dwa wykresy przedstawiające te same 200 fok na dwóch zakrzywionych piaszczystych łachach. Po lewej k-means dzieli je na lewą i prawą połowę. Po prawej DBSCAN wykrywa całe łachy, a wokół jednej foki znajduje się małe kółko oznaczone eps

Punkt, który ma min_samples punktów (wliczając siebie) w odległości eps, czyli promieniu okręgu, znajduje się w skupisku. Skupiska rozprzestrzeniają się przez takie punkty. Nie trzeba wybierać k:

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

To wyświetla 2: tłumy są numerowane od 0, więc największy numer plus jeden pozwala je policzyć.

challenge icon

Wyzwanie

Średni

Na zamarzniętym jeziorze łyżwiarze ścigają się po torze wijącym się między dwiema wyspami, a tłum ogląda mecz hokeja. k-means podzieliłoby tor na kawałki. Program odczytuje eps w metrach.

  1. Dopasuj DBSCAN z tym eps i min_samples=5; zachowaj tłumy w labels.
  2. Wypisz, ile tłumów znalazł.
  3. Narysuj je za pomocą draw_crowds(ax, X, labels) i wyświetl.

Dla innego jeziora i eps 3.5:

Crowds found: 3

Wykres zatytułowany Łyżwiarze na jeziorze: wijący się tor w kształcie litery S z 150 łyżwiarzami zaznaczonymi na niebiesko, okrągły tłum 30 osób w kolorze pomarańczowym nad lewym zakrętem oraz grupa 22 osób w kolorze zielonym pod prawym zakrętem, z legendą pokazującą liczebność grup

Coddy opisze Twój wykres. Następnie uruchom program z eps 8: dokąd zniknęły tłumy?

Spróbuj swoich sił

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

# Położenie 170 łyżwiarzy na zamarzniętym jeziorze, w metrach
skaters = pd.read_csv("skaters.csv")
X = np.column_stack([skaters["x_m"], skaters["y_m"]])
eps = float(input())


# Rysuje każdą grupę innym kolorem i oznacza ją liczbą osób
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)")

# Napisz swój kod poniżej
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Uczenie nienadzorowane

Poćwicz samodzielnie: Kompilator Python online