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

درجات السيلويت

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

يتحسن القصور الذاتي دائمًا مع زيادة k، لذا يحتاج إلى نقطة الكوع. ويطرح معامل الصورة الظلية سؤالًا أكثر إنصافًا على كل نقطة: هل أنا أقرب إلى مجموعتي من أقرب مجموعة أخرى؟

نقطة سوداء تصلها خطوط متصلة بالنقاط الثماني في مجموعتها، بمتوسط طول a = 1.3، وخطوط متقطعة بالنقاط الثماني في أقرب مجموعة أخرى، بمتوسط طول b = 3.4. معامل الصورة الظلية لها هو 0.62

تحصل النقطة على درجة (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، حيث تبدو النقاط في موضعها الأنسب.

challenge icon

التحدي

سهل

يختلف متنبئان حول عدد أنواع العواصف التي تضرب ساحلهما. يحتوي الكود المبدئي على 150 عاصفة، مع سرعة الرياح القصوى وكمية الأمطار، ويقرأ قيمة k الخاصة بـ Ana، ثم قيمة Ben.

  1. احسب درجة كل قيمة k باستخدام معامل الصورة الظلية، مع التقريب إلى 3 منازل عشرية.
  2. اطبع قيمة k التي تحقق ملاءمة أفضل.
  3. اطبع أفضل قيمة 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())

# اكتب شيفرتك أدناه
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس التعلّم غير الخاضع للإشراف

تدرّب بنفسك: مترجم Python عبر الإنترنت