Menu
CoddyTech

DBSCAN

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 20 из 51.

В этой главе вы найдёте скопления любой формы и точки, не принадлежащие ни одному из них. К концу главы вы нанесёте на карту огни в долине:

Ночная карта долины: длинный изогнутый город, круглый город и маленькая деревня, каждый обозначен своим цветом и маркером, а между ними — 10 одиноких огней, отмеченных серыми крестиками

Сначала — песчаные отмели с тюленями, на которых алгоритм k-means дал сбой в разделе «Когда k-means не справляется». DBSCAN следует за скоплениями:

Два графика с одними и теми же 200 тюленями на двух изогнутых песчаных отмелях. Слева алгоритм k-means делит их на левую и правую половины. Справа DBSCAN находит каждую отмель целиком; вокруг одного тюленя нарисован небольшой круг с подписью eps

Точка, у которой в пределах eps (радиуса окружности) находится min_samples точек, включая её саму, принадлежит к скоплению. Скопления распространяются через такие точки. Выбирать k не нужно:

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

Это выводит 2: скопления нумеруются начиная с 0, поэтому их количество равно наибольшему номеру плюс один.

challenge icon

Задание

Средне

На замёрзшем озере конькобежцы мчатся по дорожке, которая петляет между двумя островами, а толпа смотрит хоккейный матч. k-means разрезал бы дорожку на части. Программа считывает eps в метрах.

  1. Обучи DBSCAN с этим значением eps и min_samples=5; сохрани толпы в labels.
  2. Выведи, сколько толп он нашёл.
  3. Нарисуй их с помощью draw_crowds(ax, X, labels) и покажи график.

Для другого озера и eps 3.5:

Crowds found: 3

График с заголовком Skaters on the Lake: извилистая S-образная дорожка с 150 конькобежцами синего цвета, круглая толпа из 30 человек оранжевого цвета над её левым изгибом и группа из 22 человек зелёного цвета под её правым изгибом; в легенде указаны размеры толп

Coddy описывает твой график. Затем запусти программу с eps 8: куда делись толпы?

Попробуйте сами

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

# Места, где стояли 170 конькобежцев на замёрзшем озере, в метрах
skaters = pd.read_csv("skaters.csv")
X = np.column_stack([skaters["x_m"], skaters["y_m"]])
eps = float(input())


# Отображает каждую группу своим цветом с указанием числа конькобежцев в ней
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)")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение без учителя

Потренируйтесь самостоятельно: Онлайн-компилятор Python