Menu
CoddyTech

אשכולות כמאפיינים

חלק מהיחידה למידה בלתי מונחית במסלול ה-Machine Learning של Coddy. שיעור 40 מתוך 51.

מודל קווי אינו יכול להתעקם. עוצמת האות של הטלפון בשלושה כפרים נחלשת ככל שמתרחקים מהאנטנה של כל כפר — צורה שהמיקום לבדו אינו חושף:

135 בתים בשלושה כפרים, מזרח בכיוון ימין וצפון בכיוון מעלה, כל כפר סביב צלב שחור, מרכז ה-k-means שלו. קווים מקווקווים מחברים בית אדום אחד לכל שלושת המרכזים: 4.9 ק״מ, 5.2 ק״מ ו-1.0 ק״מ, הקרוב ביותר

‏k-means מוצא את הכפרים. km.transform מחזירה את המרחק של כל שורה לכל מרכז, ו־.min(axis=1) שומרת את המרחק למרכז הקרוב ביותר:

km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X_train)
near_train = km.transform(X_train).min(axis=1)
near_test = km.transform(X_test).min(axis=1)
X_train2 = np.column_stack([X_train, near_train])
X_test2 = np.column_stack([X_test, near_test])

עם העמודה הנוספת הזו, ערך R בריבוע של מודל ליניארי במבחן עולה מ-0.000 ל-0.886.

בצע התאמה של k-means לשורות האימון בלבד, כמו לסקלר, ואז בצע טרנספורמציה לשני הקבוצות.

challenge icon

אתגר

בינוני

צוות הסאונד של פסטיבל רוצה לדעת מה עוצמת הרעש במקומות שבהם אנשים עומדים. קוד הפתיחה מחלק את crowd.csv, קורא את k ומדפיס את הציון על סמך המיקום בלבד.

  1. התאימו מודל k-means עם k אשכולות למיקומי האימון.
  2. הוסיפו לכל שורה עמודה שלישית עם המרחק שלה למרכז הקרוב ביותר, בשתי הקבוצות.
  3. הדפיסו את R בריבוע החדש בבדיקה ואת השיפור, עם 3 ספרות עשרוניות.

עבור פסטיבל אחר ו-k = 4:

Position only: R squared 0.097
With the nearest of 4 centers: R squared 0.734
Gain: 0.637

נסו בעצמכם

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.cluster import KMeans

# 250 משתתפי פסטיבל: היכן עמדו (m) ועוצמת הקול שם (dB)
crowd = pd.read_csv("crowd.csv")
X = crowd[["x_m", "y_m"]].to_numpy()
y = crowd["sound_db"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
k = int(input())


# מתאים מודל רגרסיה ליניארית לעמודות האימון ומחזיר את ערך R בריבוע שלו על עמודות הבדיקה
def test_r2(A_train, A_test):
    model = LinearRegression().fit(A_train, y_train)
    return model.score(A_test, y_test)


before = test_r2(X_train, X_test)
print(f"Position only: R squared {before:.3f}")

# כתבו את הקוד שלכם למטה
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה למידה בלתי מונחית

תרגלו בעצמכם: קומפיילר Python אונליין