الوحدة 5 — DBSCAN ومجموعات بأشكال حرّة
تشاركت الوحدتان السابقتان افتراضاً واحداً: أنّ المجموعة سحابةٌ متجمّعة حول مركز. ويتخلّى DBSCAN عن هذه الفكرة تماماً ويُبدِلها بـالكثافة: فالمجموعة منطقةٌ تتراصّ فيها النقاط، أيّاً كان شكلها. وهذا التغيير في التعريف يحلّ دفعةً واحدة أكبر ضعفَين في k-means — الأشكال غير الكروية والقيم الشاذّة.
المجموعة كمنطقةٍ كثيفة
الحدس هو حدس التلامس من جارٍ إلى جار. فإن كانت نقطتان جارتين مباشرتين انتمتا إلى المجموعة نفسها؛ وإن كان لجار جاري جيرانٌ امتدّت المجموعة. وبتتبّع المناطق الكثيفة هكذا يأخذ التجمّع الشكل الذي تمنحه البيانات: هلالاً، حلزوناً، شريطاً.
ويكفي معاملان لصوغ ذلك، وكلّ DBSCAN يقوم على ضبطهما جيّداً:
eps: نصف القطر الذي يُعرِّف جيرة النقطة؛min_samples: عدد الجيران المطلوب في ذلك النصف للحديث عن منطقةٍ كثيفة.
ثلاث حالاتٍ للنقاط، إحداها حاسمة
من هذين المعاملين ينبع تصنيفٌ لكلّ نقطة، وهو ما يصنع تفرّد الطريقة:
| الحالة | التعريف | الدور |
|---|---|---|
| نقطة لبّ | لها min_samples جاراً على الأقلّ داخل eps | تُنمِّي المجموعة |
| نقطة حدّ | في جيرة نقطة لبّ، دون أن تكون لبّاً | مُلحَقة، لكن لا تنشر |
| ضجيج | لا هذه ولا تلك | لا تنتمي إلى أيّ مجموعة |
والسطر الثالث هو الإسهام الكبير. فقد كانت k-means تُسنِد كلّ نقطة، بما فيها الشاذّة التي تجذب المراكز؛ أمّا DBSCAN فيُوسِمها صراحةً ضجيجاً، بالوسم -1. فيتنقّى التجميع بذلك، وتصير النقاط المعزولة في الطريق مرشّحات طبيعية لكشف الشواذّ في الوحدة 8.
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=0.5, min_samples=5).fit(X_s)
db.labels_ # -1 يدلّ على الضجيج
(db.labels_ == -1).sum() # حجم الضجيج: مؤشّر ضبط
len(set(db.labels_)) - (1 if -1 in db.labels_ else 0) # عدد المجموعات المُكتشَفة
ولاحظ أنّنا لا نُزوّد عدد المجموعات: فـDBSCAN يستنبطه من البنية. وهذه ميزةٌ حقيقية، لكنّها تنقل الصعوبة إلى ضبط eps.
ضبط eps بلا تخبّط: مخطّط مسافات الجيران
فـeps صغيرٌ جدّاً يُعلِن كلّ شيء تقريباً ضجيجاً؛ وكبيرٌ جدّاً يدمج المجموعات كلّها في كتلةٍ واحدة. والطريقة المعيارية لمعايرته بيانية وموثوقة: لكلّ نقطة نحسب المسافة إلى جارها الأقرب رقم (بـ = min_samples)، ثمّ نرسم هذه المسافات مرتّبةً تصاعدياً. فيبقى المنحنى مستوياً — إذ للنقاط الكثيفة كلّها جارٌ قريب — ثمّ ينطلق فجأةً عند الوصول إلى النقاط المعزولة. وكوع هذا المنحنى هو eps ممتاز.
أمّا min_samples فالتقدير الشائع أن نبدأ من ضعف عدد المتغيّرات. وكلّما ارتفع كانت الخوارزمية أكثر تطلّباً وأعلنت ضجيجاً أكثر.