Menu
CoddyTech

Punteggi silhouette

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

L’inerzia migliora sempre all’aumentare di k, quindi serve un gomito. La silhouette pone a ogni punto una domanda più equa: sono più vicino al mio gruppo che al gruppo successivo?

Un punto nero con linee continue verso gli 8 punti del proprio gruppo, lunghezza media a = 1.3, e linee tratteggiate verso gli 8 punti del gruppo più vicino, lunghezza media b = 3.4. La sua silhouette è 0.62

Un punto ottiene un punteggio (b - a) / max(a, b): vicino a 1 è ben inserito nel suo gruppo, vicino a 0 è al confine, sotto 0 è nel gruppo sbagliato. La media dei punteggi valuta un clustering:

from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, f"{silhouette_score(X, km.labels_):.3f}")

Per le mele, stampa:

2 0.534
3 0.657
4 0.545

Raggiunge il picco al valore ottimale di k, qui 3, dove i punti sembrano trovarsi più a loro agio.

challenge icon

Sfida

Facile

Due previsori non sono d'accordo sul numero di tipi di tempesta che colpiscono la loro costa. Il codice iniziale contiene 150 tempeste, il vento di picco e la pioggia, e legge prima il k di Ana, poi quello di Ben.

  1. Calcola il punteggio di ciascun k usando il coefficiente silhouette, con 3 decimali.
  2. Stampa quale k si adatta meglio.
  3. Stampa il k migliore da 2 a 8, con il relativo punteggio.

Per un'altra costa:

Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)

Provalo tu

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# Non modificare le righe qui sotto
rng = np.random.default_rng(6)
# Quattro tipi di tempesta: vento e pioggia tipici e numero di tempeste per ciascun tipo
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
    parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# 150 tempeste su una costa, una per riga: velocità massima del vento (m/s) e pioggia (mm all'ora)
storms = np.round(np.concatenate(parts), 1)

# Il numero di tipi di tempesta secondo i due meteorologi
k_ana = int(input())
k_ben = int(input())

# Scrivi il tuo codice qui sotto
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