Menu
CoddyTech

DBSCAN

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 20/51。

この章では、どんな形の密集領域も、どの領域にも属さない点も見つけます。章の終わりには、谷の明かりを地図に示せるようになります。

谷の夜の地図:長く曲がりくねった町、丸い町、小さな村がそれぞれ異なる色とマーカーで示され、その間には孤立した明かりが10個、灰色のx印で示されている

まずは、「K-Meansがうまくいかないとき」でk-meansを破綻させた、アザラシたちの砂州です。DBSCANは、代わりに群れに沿ってクラスタリングします。

同じ200頭のアザラシが2つの湾曲した砂州にいる様子を示した2つのグラフ。左では、k-meansがアザラシを左右半分に分けています。右では、DBSCANがそれぞれの砂州全体を見つけています。1頭のアザラシの周りには、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から始まるため、最大の番号に1を足すと群衆の数になります。

challenge icon

チャレンジ

中級

凍った湖では、スケーターたちが2つの島の間を曲がりくねるコースを滑走し、観客がホッケーの試合を見ています。k-meansではコースを分割してしまいます。プログラムはメートル単位のepsを読み込みます。

  1. そのepsでDBSCANを学習させ、観客の集まりをlabelsに格納します。
  2. 見つかった観客の集まりの数を出力します。
  3. draw_crowds(ax, X, labels)で描画して表示します。

別の湖でepsが3.5の場合:

Crowds found: 3

Skaters on the Lakeというタイトルのグラフ:150人のスケーターが青色でS字に曲がりくねるコースを滑走し、その左側のカーブの上にオレンジ色の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オンラインコンパイラ