Clustering e k-means
In questa pagina 6
Il clustering è il secondo grande compito non supervisionato, dopo il rilevamento di anomalie (Anomaly detectionUn'anomalia (outlier) è un'osservazione che si discosta tanto dalle altre da far pensare che sia generata da un meccanismo diverso. Rilevarle serve come pulizia dei dati (solo se sono errori o rumore, non per migliorare artificialmente le metriche), come obiettivo finale (frodi, guasti, cybersicurezza) e per il monitoraggio di un modello in produzione. Metodi semplici: box plot (oltre $1{,}5,\mathrm{IQR}$), carte di controllo univariate ($\mu\pm3\sigma$) e la statistica multivariata di Hotelling $T^2=(x-\bar x)^TS^{-1}(x-\bar x)$ con soglia $\chi^2_{p,1-\alpha}$, valida per dati gaussiani e unimodali. Metodi non supervisionati multivariati danno un anomaly score: l'isolation forest isola ogni punto con split casuali (le anomalie hanno cammini corti) e calcola $s(x,n)=2^{-E(h(x))/c(n)}$, con soglia scelta dalla contaminazione. Senza etichette si valuta con esperti, eventi noti o anomalie sintetiche. Approfondimento: non nel programma di Telecomunicazioni.Anomaly detection →): raggruppare i dati in modo che i membri di uno stesso gruppo siano più simili tra loro che a quelli degli altri, senza usare etichette né categorie predefinite (Lezione 20 · Clustering e k-means, Lezione 21 · Laboratorio anomaly detection e clustering). Gli esercizi sono Esercizio - k-means a mano e gap statistic su cinque gruppi, Esercizio - Clustering gerarchico agglomerativo e divisivo, Esercizio - Regressione lineare a tratti con k-means e Esercizio - k-means online e con buffer a memoria limitata.
A che cosa serve
- Come preprocessing. Quando i dati sono eterogenei o complessi, si può usare un modello per ogni cluster (modelli locali): può migliorare molto le prestazioni (per esempio un reattore chimico che lavora in tre punti di lavoro diversi, ciascuno con una relazione lineare propria: Esercizio - Regressione lineare a tratti con k-means). Svantaggi: più complessità, e meno dati per ogni modello, con possibile peggioramento se i dati sono pochi.
- Come obiettivo finale. Marketing e pubblicità digitale (segmentazione dei clienti), organizzazione di documenti (topic modelling), analisi degli utenti di un sito, produzione industriale (dopo il clustering si può installare uno strumento di classificazione).
I due approcci visti sono il k-means e il clustering gerarchico.
K-means
Definizione (k-means). Se si conoscessero i centroidi (i centri) di gruppi, basterebbe assegnare ogni punto al centroide più vicino. L'algoritmo li trova insieme alle assegnazioni:
- Scegliere (iperparametro): il numero di cluster.
- Inizializzare i centroidi: si scelgono a caso dei punti dati come centri iniziali.
- Assegnare ogni punto al centroide più vicino (distanza euclidea o altra).
- Aggiornare ogni centroide alla media dei punti assegnati al suo cluster.
- Ripetere 3-4 fino a convergenza (i centroidi non cambiano più, o cambiano meno di una tolleranza, o si è raggiunto il numero massimo di iterazioni).
centroidi = K punti casuali del dataset
ripeti:
etichetta[i] = indice del centroide più vicino a x_i
nuovo_centroide[k] = media dei punti con etichetta k
se i centroidi non cambiano (entro tol): stopChe cosa minimizza
Per definire la «convergenza» serve una metrica: l'errore quadratico medio entro i cluster, dove è il numero totale di punti, il numero di cluster, l'insieme dei punti del cluster e il suo centroide (la media). Si usa anche la dispersione entro i cluster non divisa per : (inerzia).
Perché l'algoritmo funziona (non sale mai). Ciascuno dei due passi fa diminuire (o lascia uguale) :
- Assegnazione: spostare un punto dal suo cluster a quello con centroide più vicino non può aumentare la somma delle distanze al quadrato.
- Aggiornamento: fissate le assegnazioni, per un cluster il punto che minimizza è la media: si annulla il gradiente rispetto a , (Derivate parziali e derivate direzionaliLa derivata parziale ∂f/∂xi(x0) è la derivata della funzione di una variabile che si ottiene fissando tutte le altre variabili: in pratica si deriva in xi trattando le altre come costanti. Il gradiente ∇f raccoglie le derivate parziali. La derivata direzionale lungo un versore v è il limite di [f(x0 + hv) − f(x0)]/h. In più variabili avere tutte le derivate (anche direzionali) non garantisce la continuità.Derivate parziali e derivate direzionali →, Massimi e minimi liberi in più variabiliSe f è differenziabile e ha un estremo relativo in un punto interno x0, allora ∇f(x0) = 0 (Fermat): gli estremi interni vanno cercati tra i punti critici. Se f è C², in un punto critico: hessiana definita positiva → minimo, definita negativa → massimo, indefinita → sella, semidefinita → il test non decide e si studia il segno di f(x) − f(x0). In due variabili: det H > 0 e fxx > 0 minimo, det H > 0 e fxx < 0 massimo, det H < 0 sella.Massimi e minimi liberi in più variabili →; analogo statistico: la media campionaria, Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso →). Si tratta di un minimo perché la funzione è una paraboloide. Poiché non cresce e il numero di partizioni dei punti è finito, l'algoritmo converge. Ma a un minimo locale, non necessariamente globale.
Esempio svolto. Sette punti: A, B, C, D, E, F, G con e centroidi iniziali A e D.
- Assegnazione 1. Distanze da e : A ; B ; C pareggio, assegnato al primo ; D ; E ; F ; G .
- Aggiornamento 1. ; . .
- Assegnazione 2. C è ora più vicino a (distanza da : ; da : ). Nuovi cluster: e . Centroidi e , .
- Assegnazione 3: nessun cambiamento, convergenza.
Grafico interattivo: Risultato del k-means con K = 2 sui sette punti (cluster {A, B} in blu e {C, D, E, F, G} in rosso): le croci sono i centroidi finali (1,25; 1,5) e (3,9; 5,1), W = 8,525
Sensibilità all'inizializzazione. I centroidi iniziali casuali possono portare a minimi locali diversi. Esempio: i quattro punti con . Se i centroidi iniziali sono e , il punto è più vicino al primo e al secondo: i cluster sono e con centroidi e , e l'algoritmo è già fermo con . La soluzione migliore (sinistra e destra) ha centroidi e e . Per questo si fa partire l'algoritmo più volte con inizializzazioni diverse e si tiene la migliore (o si fissa un seme); esiste anche l'inizializzazione k-means++, che sceglie centri iniziali lontani tra loro.
Ipotesi implicite. Il k-means separa bene gruppi compatti e di forma sferica, con dimensioni simili; funziona male per gruppi allungati o a forma di anelli (vedi il gerarchico con linkage single). Come ogni metodo con distanze, richiede feature standardizzate (Classificazione e k-nearest neighborsNella classificazione l'uscita $y$ è una categoria (con $C$ classi; $C=2$ è il caso binario). Il classificatore più semplice è il k-nearest neighbors: una nuova osservazione prende la classe più frequente (voto di maggioranza) tra i suoi $k$ vicini più prossimi nel training, con distanza euclidea $\sqrt{\sum(A_i-B_i)^2}$ o di Manhattan $\sum|A_i-B_i|$ (per la regressione si fa la media dei vicini). $k$ è un iperparametro: $k$ piccolo dà bordi frastagliati e overfitting, $k$ grande underfitting. È un metodo basato su istanze e «pigro» (nessun addestramento, costo alla predizione), sensibile a scala e feature irrilevanti e alla maledizione della dimensionalità; gli ingressi categorici si codificano con one-hot. Approfondimento: non nel programma di Telecomunicazioni.Classificazione e k-nearest neighbors →, Statistica per il machine learningI dati di un problema ML si organizzano nella matrice di progetto $X$ ($n$ osservazioni, $p$ variabili). La statistica serve a capirli, ripulirli e prepararli: i momenti (media $\mu$, varianza $\sigma^2$, asimmetria, curtosi), i quartili con lo scarto interquartile $\mathrm{IQR}=Q_3-Q_1$ (all'esame senza interpolazione), la moda per i dati categorici. Con queste quantità si imputano i dati mancanti (media o mediana), si eliminano le variabili costanti e si standardizza con lo z-score $z=(x-\mu)/\sigma$, usando sempre media e deviazione standard del solo training set.Statistica per il machine learning →). Il k-means è anche usabile per classificare un nuovo punto: lo si assegna al centroide più vicino.
Versioni a memoria limitata
Il k-means standard richiede di conservare tutti i punti per ricalcolare le medie. Con la media incrementale si può aggiornare un centroide senza i punti: se il cluster ha punti e centroide e arriva un nuovo punto assegnato a quel cluster, (la seconda forma si ottiene scrivendo ). Basta quindi tenere in memoria solo i centroidi e i contatori (k-means online). Una variante intermedia, il k-means a buffer, tiene al massimo punti campionati e ricalcola i centroidi solo da quelli. Esempio: centroide con punti e nuovo punto : .
Quanti cluster?
Il numero non è noto a priori.
Metodo del gomito
Al crescere di la dispersione entro i cluster diminuisce sempre (più cluster adattano meglio i dati: per è zero), ma dopo un certo punto il guadagno è marginale e i nuovi cluster si limitano a sovradattare. Il «gomito» del grafico (o dell'errore medio) contro è il punto in cui il miglioramento comincia ad appiattirsi.
Esempio (laboratorio: 1000 punti in cinque gruppi gaussiani, deviazione standard , centri , , , , ). per : . Dopo il calo è minimo: gomito a .
Grafico interattivo: Metodo del gomito: errore quadratico medio entro i cluster in funzione di K per i cinque gruppi del laboratorio: scende ripidamente fino a K = 5 e poi quasi si ferma (gomito a K = 5)
Gap statistic
Il gomito è un criterio visivo e soggettivo. La gap statistic confronta il clustering ottenuto con quello che ci si aspetterebbe da dati senza struttura: «il clustering osservato è migliore di quello su dati casuali?»
- Per ogni (per esempio da 1 a 10) si esegue il k-means sui dati reali e si calcola la dispersione .
- Si generano dataset di riferimento con lo stesso numero di campioni e dimensioni e gli stessi limiti dei dati originali, ma con valori estratti da una distribuzione uniforme (nessuna struttura); servono più dataset per non dipendere da una singola realizzazione.
- Si esegue il k-means su ciascuno e si calcola .
- : più alto è il gap, migliore è il clustering rispetto al caso. Si usa il logaritmo perché interessa il rapporto tra le due dispersioni.
- Si sceglie il più piccolo tale che , dove è la deviazione standard dei (tiene conto dell'incertezza dei dati casuali).
Esempio (stessi cinque gruppi). Gap per : (laboratorio). Per : ? No. Per : sì: si sceglie . (Una replica indipendente con 10 dataset di riferimento ha dato .)
Clustering gerarchico
Definizione (clustering gerarchico). Costruisce un albero di cluster, il dendrogramma, in due modi:
- agglomerativo (bottom-up): ogni punto parte come cluster a sé e si fondono cluster passo dopo passo;
- divisivo (top-down): si parte da un unico cluster che contiene tutto e lo si divide passo dopo passo.
Un dendrogramma è un diagramma ad albero che mostra il processo di fusione (l'altezza di ciascuna fusione è la distanza tra i cluster fusi); lo si «taglia» a un certo livello per decidere quanti cluster ottenere.
Agglomerativo, algoritmo. (1) Ogni punto è un cluster. (2) Si calcolano le distanze tra tutti i cluster. (3) Si fondono i due più vicini. (4) Si aggiornano le distanze. (5) Si ripete finché resta un solo cluster (o cluster). Con campioni e cluster desiderati servono iterazioni, perché a ogni fusione il numero di cluster diminuisce di uno.
Distanza tra cluster (linkage). Per due cluster :
- single linkage (distanza minima): ;
- complete linkage (distanza massima): ;
- average linkage (distanza media): ;
- Ward: fonde la coppia che aumenta meno la varianza totale entro i cluster.
Esempio svolto (average e single linkage). Sei punti , , , , , e distanza euclidea. Ordine delle fusioni con average linkage (distanza di fusione tra parentesi): ; poi con ; ; con ; infine i due gruppi e . Con single linkage le distanze sono : stessi gruppi, altezze diverse. Il salto grande nell'ultima fusione indica che due cluster sono la scelta naturale.
Il laboratorio memorizza il processo con una matrice di assegnazione: una riga per iterazione e una colonna per campione; l'elemento è l'etichetta del cluster del campione all'iterazione (la riga contiene cluster); la riga iniziale è . I centroidi si ottengono come baricentri dei cluster.
Forme dei gruppi. Con linkage single le fusioni seguono catene di punti vicini e si riescono a separare forme allungate (due «lune», due anelli concentrici); con average o complete (e come il k-means) i cluster tendono a essere compatti e le forme non convesse non sono separate bene. Lo svantaggio del single è l'effetto «catena» (un ponte di punti unisce due gruppi).
Divisivo. In ogni passo si sceglie il cluster da dividere (per esempio quello con la maggiore distanza media tra le coppie di punti, cioè la dispersione più alta) e lo si divide in due con un criterio (per esempio con il k-means con ). Per ottenere cluster servono divisioni (Esercizio - Clustering gerarchico agglomerativo e divisivo).
Costo. La versione ingenua confronta tutte le coppie di cluster a ogni passo (almeno quadratico per ogni passo, circa cubico in totale): è molto più costosa del k-means per grande.
Codice
import numpy as np
def kmeans(X, k, max_iters=100, tol=1e-6, rng=np.random):
centroids = X[rng.choice(len(X), k, replace=False)] # K punti a caso
for _ in range(max_iters):
d = np.linalg.norm(X[:, None] - centroids[None], axis=2) # (n, k) distanze
labels = d.argmin(axis=1) # assegnazione
new = np.array([X[labels == j].mean(axis=0) for j in range(k)]) # medie
if np.all(np.abs(new - centroids) < tol): break
centroids = new
return labels, centroids
def within_dispersion(X, labels, centroids): # W_K per gomito e gap
return sum(((X[labels == j] - centroids[j]) ** 2).sum() for j in range(len(centroids)))Attenzione: un cluster che resta senza punti dà una media non definita (nan); in tal caso si reinizializza quel centroide. Con scikit-learn: KMeans(n_clusters=5, n_init=10).fit(X) e AgglomerativeClustering(n_clusters=3, linkage="average").
Errori tipici
- Scegliere minimizzando l'errore entro i cluster: cala sempre, e per vale zero.
- Lanciare il k-means una sola volta senza guardare l'inizializzazione.
- Usare il k-means senza standardizzare le feature, o su gruppi non sferici.
- Scrivere nella gap statistic con il segno invertito: si sottrae dei dati reali dalla media dei .
- Contare male le iterazioni agglomerative: servono fusioni per cluster.
- Scordare che il dendrogramma si taglia a un'altezza: il numero di cluster lo decide chi usa l'algoritmo.
Versione ripasso
Definizione. Clustering: raggruppare osservazioni simili senza etichette. Preprocessing (un modello per cluster: più complessità, meno dati per modello) oppure obiettivo (segmentazione clienti, documenti, utenti).
Definizione (k-means). Scegliere ; centroidi iniziali = punti a caso; ripetere: assegnare ogni punto al centroide più vicino, aggiornare ogni centroide alla media del suo cluster; fermarsi quando i centroidi non cambiano.
Esempio. A, B, C, D, E, F, G, centroidi iniziali A e D: dopo 2 aggiornamenti cluster e , centroidi e , .
Formula. ; = stessa somma senza . Per un cluster fissato la media minimizza la somma dei quadrati ().
Convergenza. non cresce a nessun passo e le partizioni sono finite converge, ma a un minimo locale (dipende dall'inizializzazione: rettangolo , contro ); si rilancia più volte. Adatto a gruppi compatti e sferici; feature standardizzate.
Media incrementale (online): : bastano centroidi e contatori. Variante a buffer: al più punti.
Numero di cluster. Gomito: cala sempre, si cerca dove rallenta (5 gruppi: , gomito a ). Gap statistic: dataset di riferimento uniformi con stessi limiti; ; si prende il più piccolo con (esempio: ).
Gerarchico. Dendrogramma (altezza = distanza di fusione), si taglia a un livello. Agglomerativo: un cluster per punto, si fondono i due più vicini; iterazioni per cluster. Linkage: single , complete , average , Ward. Single segue forme allungate (ma effetto catena). Divisivo: si divide il cluster più disperso (es. con k-means, ); divisioni.
Esempio. Sei punti, average linkage: fusioni a .
Errori tipici: scelto minimizzando ; una sola inizializzazione; niente standardizzazione; contato male.