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

متى تفشل خوارزمية K-Means

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

يصوّر K-means كل عنقود على هيئة كتلة دائرية حول مركزه. تشكّل رميات السهام لوحةَ تصويب مركزية تحيط بها حلقة، لكن K-means يقسمها إلى نصفين:

مخططان يضمان 140 رمية سهم. على اليسار، التوزيع الحقيقي: مجموعة متراصة في لوحة التصويب المركزية داخل حلقة واسعة. على اليمين، K-means مع k = 2: يقسم خط مستقيم متقطع اللوحةَ والحلقةَ ولوحةَ التصويب المركزية إلى نصف أيسر ونصف أيمن، ولكل منهما علامة مركز متقاطعة

تنضم كل نقطة إلى أقرب مركز إليها، لذا يكون الحد الفاصل بين مجموعتين خطًا مستقيمًا يقع في منتصف المسافة بين المركزين. ولا يوجد خط مستقيم يفصل حلقةً عن وسطها.

المجموعات الطويلة والمنحنية أو غير المتجانسة جدًا تُفسد نتائج k-means بالطريقة نفسها. ستظل الخوارزمية تُرجع عناقيد، لذا انظر دائمًا إلى الرسم.

challenge icon

التحدي

متوسط

رصدت طائرة مسيّرة 200 فقمة على شريطين رمليين منحنيين. يرسم الكود المبدئي الحقيقة في اللوحة left.

  1. جمّع الفقمات باستخدام k-means، حيث k = 2.
  2. في اللوحة right، ارسم نقاط كل عنقود، مع تسميته cluster 0 أو cluster 1.
  3. حدّد المراكز بعلامات سوداء على شكل "X"، وسمّها centers. أضف وسيلة إيضاح، ثم اعرض الرسم.

يصف Coddy الرسم البياني ويحصي الفقمات التي بقيت مع شريطها الرملي الأصلي. مثل هذا، لمجموعتين:

رسمان بيانيان. على اليسار، الحقيقة: مجموعة كبيرة متناثرة ومجموعة صغيرة متقاربة إلى يمينها. على اليمين، k-means مع k = 2: يضم عنقود المجموعة الصغيرة أيضًا الحافة اليمنى للمجموعة الكبيرة، وتشير علامتا تقاطع سوداء إلى المركزين

جرّب بنفسك

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans

# 200 فقمة تستريح على لسانين رمليين منحنيين، كما تُرى من طائرة مسيّرة (المواضع بوحدات 100 m)
X, sandbar = make_moons(n_samples=200, noise=0.07, random_state=4)


# يرسم اللسانين الرمليين الحقيقيين على ax
def draw_truth(ax):
    ax.scatter(X[sandbar == 0, 0], X[sandbar == 0, 1], s=12, label="north bar")
    ax.scatter(X[sandbar == 1, 0], X[sandbar == 1, 1], s=12, label="south bar")
    ax.set_title("The truth")
    ax.legend()


fig, (left, right) = plt.subplots(1, 2, figsize=(9, 4))
draw_truth(left)
right.set_title("K-means, k = 2")

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

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

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

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