Menu
CoddyTech
flag Ar iconالعربيةdown icon

DBSCAN

جزء من قسم التعلّم غير الخاضع للإشراف في رحلة Machine Learning على Coddy. الدرس 20 من 51.

يحدّد هذا الفصل التجمعات ذات الأشكال المختلفة، والنقاط التي لا تنتمي إلى أيٍّ منها. وفي نهايته، سترسم خريطة لأضواء وادٍ:

خريطة ليلية لوادٍ: بلدة طويلة منحنية، وبلدة مستديرة، وقرية صغيرة، لكل منها لون وعلامة خاصان، و10 أضواء منفردة على شكل علامات x رمادية بينها

أولًا، أشرطة الرمال التي تستلقي عليها الفقمات، والتي تسببت في إخفاق 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 عبر الإنترنت