DBSCAN
חלק מהיחידה למידה בלתי מונחית במסלול ה-Machine Learning של Coddy. שיעור 20 מתוך 51.
בפרק הזה נמצא קהלים בכל צורה, וגם את הנקודות שלא שייכות לאף אחד מהם. בסופו תמפה את האורות בעמק:
ראשית, שרטוני החול של כלבי הים ששברו את k-means בשיעור „כש-k-means נכשל”. DBSCAN הולך בעקבות ההתקבצויות במקום:
נקודה שיש לה min_samples נקודות (כולל היא עצמה) בתוך eps, רדיוס המעגל, נמצאת בקהל. קהלים מתפשטים דרך נקודות כאלה. אין צורך לבחור k:
from sklearn.cluster import DBSCAN
labels = DBSCAN(eps=0.2, min_samples=5).fit_predict(X)
print(labels.max() + 1)פעולה זו מדפיסה את 2: ההמונים ממוספרים החל מ־0, ולכן המספר הגדול ביותר ועוד אחד נותן את מספרם.
אתגר
בינוניבאגם קפוא, מחליקים מתחרים לאורך מסלול שמתפתל בין שני איים, וקהל צופה במשחק הוקי. k-means היה מחלק את המסלול לחלקים. התוכנית קוראת את eps במטרים.
- התאם את DBSCAN עם eps הזה ועם
min_samples=5; שמור את הקהלים ב-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 אונליין