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

تنفيذ K-Means يدويًا

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

خوارزمية K-means تكرّر جولة من خطوتين للعثور على k عناقيد. الإسناد: تنضم كل نقطة إلى أقرب مركز. التحريك: ينتقل كل مركز إلى متوسط نقاطه. ثلاث عربات للمثلجات:

150 منشفة على شاطئ ضمن ثلاث مجموعات، يسارًا ووسطًا ويمينًا. تبدأ ثلاث عربات متقاربة قرب الوسط؛ وتتتبّع خطوط سوداء مسار كل عربة جولةً تلو الأخرى حتى تصل إلى نجمة في وسط مجموعتها الخاصة

جولة واحدة في NumPy، حيث إن dists جدول مسافات يحتوي على عمود واحد لكل مركز:

labels = dists.argmin(axis=1)  # تعيين
for c in range(k):
    centers[c] = X[labels == c].mean(axis=0)  # نقل

تعطي argmin(axis=1) أصغر عمود في كل صف: أي أقرب مركز إليه. تستقر المراكز جولةً بعد جولة؛ وعندما لا يتحرك أيٌّ منها، تنتهي خوارزمية k-means.

challenge icon

التحدي

سهل

تعيد شركة لصناعة القمصان ضبط مقاساتها S وM وL لتناسب زبائن اليوم. يحدّد مخطط المقاسات القديم مراكز البداية، وتعطي distances(people, centers) جدول المسافات، ويقرأ البرنامج عدد الجولات المطلوب تنفيذها.

  1. في كل جولة: حدّد المقاس المناسب لكل شخص، ثم حرّك كل مركز.
  2. اطبع مركز كل مقاس وعدد الأشخاص الذين انتموا إليه في الجولة الأخيرة، كما هو موضح أدناه.

لشركة أخرى:

Rounds run: 2
S: chest 87.3 cm, length 65.1 cm, 14 people
M: chest 95.0 cm, length 68.9 cm, 31 people
L: chest 104.8 cm, length 72.6 cm, 45 people

جرّب بنفسك

import numpy as np

# لا تغيّر الأسطر أدناه
rng = np.random.default_rng(12)
chest = np.concatenate([rng.normal(88, 3, 30), rng.normal(98, 3.5, 35), rng.normal(110, 4, 25)])
length = np.concatenate([rng.normal(66, 1.8, 30), rng.normal(70, 2, 35), rng.normal(75, 2.2, 25)])
# 90 عميلًا، صف واحد لكل منهم: محيط الصدر والطول بوحدة cm
people = np.round(np.column_stack([chest, length]), 1)

# يحدّد جدول المقاسات القديم المراكز الابتدائية: S، M، L
sizes = ["S", "M", "L"]
centers = np.array([[85.0, 64.0], [90.0, 67.0], [96.0, 69.0]])
rounds = int(input())


# جدول المسافات: صف واحد لكل شخص، وعمود واحد لكل مركز
def distances(X, centers):
    table = np.zeros((len(X), len(centers)))
    for c in range(len(centers)):
        table[:, c] = np.sqrt(((X - centers[c]) ** 2).sum(axis=1))
    return table


# اكتب الكود الخاص بك أدناه
quiz iconاختبر نفسك

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

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

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