درجات السيلويت
جزء من قسم التعلّم غير الخاضع للإشراف في رحلة Machine Learning على Coddy. الدرس 8 من 51.
يتحسن القصور الذاتي دائمًا مع زيادة k، لذا يحتاج إلى نقطة الكوع. ويطرح معامل الصورة الظلية سؤالًا أكثر إنصافًا على كل نقطة: هل أنا أقرب إلى مجموعتي من أقرب مجموعة أخرى؟
تحصل النقطة على درجة (b - a) / max(a, b): قريبًا من 1 يعني أنها منسجمة ضمن مجموعتها، وقريبًا من 0 يعني أنها على الحدود، وأقل من 0 يعني أنها في المجموعة الخطأ. ويحسب المتوسط درجةً للتجميع:
from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
km = KMeans(n_clusters=k, n_init=10, random_state=0)
km.fit(X)
print(k, f"{silhouette_score(X, km.labels_):.3f}")بالنسبة إلى التفاح، يطبع هذا:
2 0.534
3 0.657
4 0.545يبلغ ذروته عند أفضل قيمة لـ k، وهي هنا 3، حيث تبدو النقاط في موضعها الأنسب.
التحدي
سهليختلف متنبئان حول عدد أنواع العواصف التي تضرب ساحلهما. يحتوي الكود المبدئي على 150 عاصفة، مع سرعة الرياح القصوى وكمية الأمطار، ويقرأ قيمة k الخاصة بـ Ana، ثم قيمة Ben.
- احسب درجة كل قيمة k باستخدام معامل الصورة الظلية، مع التقريب إلى 3 منازل عشرية.
- اطبع قيمة k التي تحقق ملاءمة أفضل.
- اطبع أفضل قيمة k من 2 إلى 8، مع درجتها.
لساحل آخر:
Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)جرّب بنفسك
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# لا تغيّر الأسطر أدناه
rng = np.random.default_rng(6)
# أربعة أنواع من العواصف: سرعة الرياح وكمية الأمطار المعتادتان، وعدد العواصف من كل نوع
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# 150 عاصفة على ساحل واحد، صف واحد لكل عاصفة: أقصى سرعة للرياح (m/s) وكمية الأمطار (mm في الساعة)
storms = np.round(np.concatenate(parts), 1)
# عددا أنواع العواصف اللذان حددهما المتنبئان بالطقس
k_ana = int(input())
k_ben = int(input())
# اكتب شيفرتك أدناه
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس التعلّم غير الخاضع للإشراف
1اكتشاف المجموعات
التعلّم دون تسمياتقياس التشابهتنفيذ K-Means يدويًااستخدام K-Means في scikit-learnمراجعة: أعضاء النادي الرياضيتدرّب بنفسك: مترجم Python عبر الإنترنت