Menu
CoddyTech

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 לקוחות, שורה אחת לכל לקוח: היקף חזה ואורך בס"מ
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 אונליין