Menu
CoddyTech

Quando K-Means fallisce

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

K-means rappresenta ogni cluster come una macchia rotonda attorno al suo centro. Le freccette formano un centro pieno con un anello intorno, e k-means li divide a metà:

Due grafici con 140 freccette. A sinistra, la realtà: un gruppo compatto al centro del bersaglio all'interno di un ampio anello. A destra, k-means con k = 2: un bordo tratteggiato rettilineo divide il bersaglio, l'anello e il centro in una metà sinistra e una metà destra, ciascuna con una croce al centro

Ogni punto si unisce al centro più vicino, quindi il confine tra due cluster è una linea retta a metà strada tra i centri. Nessuna linea retta separa un anello dal suo centro.

Gruppi lunghi, curvi o molto irregolari compromettono k-means allo stesso modo. Restituisce comunque dei cluster, quindi guarda sempre l'immagine.

challenge icon

Sfida

Medio

Un drone ha individuato 200 foche su due banchi di sabbia curvi. Il codice iniziale mostra la verità nel pannello left.

  1. Raggruppa le foche con k-means, k = 2.
  2. Nel pannello right, crea uno scatter plot per ogni cluster, etichettato cluster 0 o cluster 1.
  3. Segna i centri con marker neri "X" etichettati centers. Aggiungi una legenda, poi mostra il grafico.

Coddy descrive il tuo grafico e conta le foche rimaste nel proprio banco di sabbia. Come in questo esempio, con due gruppi:

Due grafici. A sinistra, la verità: un gruppo numeroso e sparso e un piccolo gruppo compatto alla sua destra. A destra, k-means con k = 2: il cluster del piccolo gruppo include anche il bordo destro del gruppo numeroso, e delle croci nere indicano i due centri

Provalo tu

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans

# 200 foche che riposano su due banchi di sabbia curvi, viste da un drone (posizioni in 100 m)
X, sandbar = make_moons(n_samples=200, noise=0.07, random_state=4)


# Disegna i banchi di sabbia reali su ax
def draw_truth(ax):
    ax.scatter(X[sandbar == 0, 0], X[sandbar == 0, 1], s=12, label="north bar")
    ax.scatter(X[sandbar == 1, 0], X[sandbar == 1, 1], s=12, label="south bar")
    ax.set_title("The truth")
    ax.legend()


fig, (left, right) = plt.subplots(1, 2, figsize=(9, 4))
draw_truth(left)
right.set_title("K-means, k = 2")

# 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