DAI-utvecklareLaboration· ca 45 min· sandlåda på servern
Labb: k-means från grunden
Implementera k-means (tilldela, uppdatera, upprepa), visa att tröghetsmåttet aldrig ökar, och hitta kluster i syntetisk data.
Teori
Upprepa: tilldela varje punkt till närmaste centroid; flytta varje centroid till medelvärdet av sina punkter. Trögheten (summa kvadratavstånd) minskar monotont.
Deluppgifter
- assign —
assign(X, C)→ index till närmaste centroid per rad. - update —
update(X, labels, k)→ nya centroider (tomt kluster behåller gamla via NaN-hantering: använd X-medel). - kmeans —
kmeans(X, k, steps, seed)→ (C, labels, inertia_history).
Godkänt när: inertia <= 250
Startkoden
körs i en isolerad sandlåda på servernimport numpy as np
def assign(X, C):
# TODO: avstånd (n, k) → argmin per rad
...
def update(X, labels, k):
# TODO: medelvärde per kluster; tomt kluster → X.mean(axis=0)
...
def inertia(X, C, labels):
return float(((X - C[labels]) ** 2).sum())
def kmeans(X, k=3, steps=20, seed=0):
rng = np.random.default_rng(seed)
C = X[rng.choice(len(X), k, replace=False)]
hist = []
for _ in range(steps):
# TODO: assign → hist.append(inertia) → update
...
return C, assign(X, C), hist
Du skriver koden, tester du inte ser avgör om den håller. Skapa ett gratis konto för att köra labben.
Prova diagnosenSkapa konto gratisFörväntade resultat
Trögheten minskar monotont; på tre tydliga blobbar hittas rätt kluster (tröghet < 250).
Vanliga fel
- Byter axel i avståndsberäkningen.
- Tomt kluster ger NaN-centroid.
- Initierar centroider utanför datan.