Menu
CoddyTech

Il metodo del gomito

Fa parte della sezione Apprendimento non supervisionato del percorso Machine Learning di Coddy. Lezione 7 di 51.

Traccia l'inerzia rispetto a k. Ogni nuovo centro divide un gruppo reale e l'inerzia crolla; poi si appiattisce. La piega, il gomito, indica un buon valore di k:

Due curve dell'inerzia per k from 1 to 8. A sinistra, le mele: un forte calo fino a k = 3, poi quasi piatta, con una linea tratteggiata a 3. A destra, punti senza gruppi: una curva uniforme senza pieghe

Una regola pratica: fermati quando un centro in più riduce l'inerzia di meno di un quarto. Le riduzioni con le mele: 56%, poi 69%, poi solo 15%. Quindi k = 3:

ax.plot(ks, inertias, marker="o")
ax.axvline(3, linestyle="--")

Una curva dolce senza pieghe non indica gruppi distinti. La prossima lezione introduce un secondo giudice.

challenge icon

Sfida

Facile

Un’app per piante suddivide le piante da appartamento in piani di cura in base alle esigenze di luce e acqua. Il codice iniziale contiene le inerzie per k from 1 to 8, un grafico e cutoff.

  1. Partendo da k = 1 e salendo, fermati quando il k successivo riduce l’inerzia di meno di cutoff. Stampa quel k.
  2. Traccia l’inerzia in funzione di k con dei punti, una linea verticale tratteggiata in corrispondenza del tuo k e mostra il grafico.

Per un’altra app, cutoff 0.25:

Care plans: 3

Una curva dell’inerzia intitolata Elbow: Care Plans per k from 1 to 8, con un punto per ogni k: un forte calo fino a k = 3, poi un andamento quasi piatto e una linea verticale tratteggiata in corrispondenza di 3

Poi Coddy descrive il tuo grafico.

Provalo tu

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# No cambies las líneas de abajo
rng = np.random.default_rng(17)
# Cuatro tipos de plantas: sus necesidades habituales de luz y agua, y cuántas hay de cada tipo
kinds = [(8.5, 2, 35), (2.5, 7.5, 30), (5, 5, 30), (8, 8, 25)]
parts = []
for l, w, n in kinds:
    parts.append(np.column_stack([rng.normal(l, 0.8, n), rng.normal(w, 0.8, n)]))
# 120 plantas de interior, una por fila: necesidades de luz y agua, puntuadas de 1 a 10
plants = np.clip(np.round(np.concatenate(parts), 1), 1, 10)

# Inercia para k = 1 a 8, de Inertia
ks = list(range(1, 9))
inertias = []
for k in ks:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(plants)
    inertias.append(km.inertia_)

cutoff = float(input())
fig, ax = plt.subplots()
ax.set_title("Elbow: Care Plans")
ax.set_xlabel("k")
ax.set_ylabel("Inertia")

# Escribe tu código a continuación
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento non supervisionato

Esercitati da solo: Compilatore Python online