1. Idea di base del clustering
Il clustering è una tecnica di apprendimento non supervisionato che raggruppa i dati in base alla loro somiglianza. Nel caso di k-means assumiamo di voler trovare k gruppi (cluster) nei dati.
Ogni cluster è rappresentato da un centroide, cioè un punto medio. L'obiettivo è minimizzare la distanza complessiva dei punti dal centroide del cluster a cui appartengono.
2. Ruolo delle distanze
Il cuore di k-means è la distanza tra punti. Di solito si usa la distanza euclidea, ma non è l'unica possibile.
- Distanza euclidea: classica distanza geometrica.
- Distanza Manhattan: somma delle differenze assolute.
- Altre metriche: Minkowski, cosine, ecc.
La scelta della distanza influisce profondamente sulla forma dei cluster. È collegata ai concetti introdotti nella pagina su Distanze e metriche.
3. L'algoritmo k-means in breve
- Scegliere il numero di cluster k.
- Inizializzare casualmente k centroidi.
- Assegnare ogni punto al centroide più vicino (fase di assegnazione).
- Ricalcolare i centroidi come media dei punti assegnati (fase di aggiornamento).
- Ripetere assegnazione/aggiornamento finché i centroidi non cambiano quasi più.
Il risultato è una partizione dei dati in k cluster, ognuno con il proprio centroide.
4. Esempio in Python con scikit-learn
Usiamo scikit-learn per applicare k-means a dati sintetici bidimensionali.
import numpy as np
from sklearn.cluster import KMeans
# Dati di esempio: tre "nuvole" di punti
rng = np.random.default_rng(42)
X1 = rng.normal(loc=[0, 0], scale=0.5, size=(50, 2))
X2 = rng.normal(loc=[3, 3], scale=0.5, size=(50, 2))
X3 = rng.normal(loc=[0, 4], scale=0.5, size=(50, 2))
X = np.vstack([X1, X2, X3])
# Applichiamo k-means con k=3
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
print("Centroidi:")
print(centroids)
In un notebook puoi visualizzare i punti colorati in base a labels
e i centroidi come marker distinti, per capire visivamente il risultato.
5. Limiti e varianti di k-means
- Forma dei cluster: k-means lavora bene con cluster "a nuvola" (convessi).
- Sensibilità agli outlier: punti molto lontani possono spostare i centroidi.
- Scelta di k: non sempre è ovvio; si usano metodi come il "gomito".
Varianti come k-medoids o metodi basati sulla densità (es. DBSCAN) possono essere più adatti quando i cluster hanno forme complesse o ci sono molti outlier.