DBSCAN
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 20/51。
この章では、どんな形の密集領域も、どの領域にも属さない点も見つけます。章の終わりには、谷の明かりを地図に示せるようになります。
まずは、「K-Meansがうまくいかないとき」でk-meansを破綻させた、アザラシたちの砂州です。DBSCANは、代わりに群れに沿ってクラスタリングします。
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を足すと群衆の数になります。
チャレンジ
中級凍った湖では、スケーターたちが2つの島の間を曲がりくねるコースを滑走し、観客がホッケーの試合を見ています。k-meansではコースを分割してしまいます。プログラムはメートル単位のepsを読み込みます。
- そのepsでDBSCANを学習させ、観客の集まりを
labelsに格納します。 - 見つかった観客の集まりの数を出力します。
draw_crowds(ax, X, labels)で描画して表示します。
別の湖でepsが3.5の場合:
Crowds found: 3Coddyがグラフについて説明します。次に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)")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ