Menu
CoddyTech

DBSCAN

חלק מהיחידה למידה בלתי מונחית במסלול ה-Machine Learning של Coddy. שיעור 20 מתוך 51.

בפרק הזה נמצא קהלים בכל צורה, וגם את הנקודות שלא שייכות לאף אחד מהם. בסופו תמפה את האורות בעמק:

מפת לילה של עמק: עיירה ארוכה ומעוקלת, עיירה עגולה וכפר קטן, כל אחד בצבע ובסמן משלו, ו-10 אורות בודדים המסומנים באיקסים אפורים ביניהם

ראשית, שרטוני החול של כלבי הים ששברו את k-means בשיעור „כש-k-means נכשל”. DBSCAN הולך בעקבות ההתקבצויות במקום:

שני תרשימים של אותם 200 כלבי ים על שני שרטוני חול מעוקלים. משמאל, k-means מחלק אותם לחצי שמאלי ולחצי ימני. מימין, DBSCAN מוצא כל שרטון חול בשלמותו, עם מעגל קטן שכותרתו eps סביב כלב ים אחד

נקודה שיש לה 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, ולכן המספר הגדול ביותר ועוד אחד נותן את מספרם.

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 אונליין