Salta al contenuto
Note per Studenti Clustering e k-means

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 KK gruppi, basterebbe assegnare ogni punto al centroide più vicino. L'algoritmo li trova insieme alle assegnazioni:

  1. Scegliere KK (iperparametro): il numero di cluster.
  2. Inizializzare i centroidi: si scelgono a caso KK dei punti dati come centri iniziali.
  3. Assegnare ogni punto al centroide più vicino (distanza euclidea o altra).
  4. Aggiornare ogni centroide alla media dei punti assegnati al suo cluster.
  5. 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): stop

Che cosa minimizza

Per definire la «convergenza» serve una metrica: l'errore quadratico medio entro i cluster, MSEwithin=1N∑k=1K∑xi∈Ck∥xi−μk∥2,\mathrm{MSE}_{\text{within}}=\frac1N\sum_{k=1}^K\sum_{x_i\in C_k}\lVert x_i-\mu_k\rVert^2, dove NN è il numero totale di punti, KK il numero di cluster, CkC_k l'insieme dei punti del cluster kk e μk\mu_k il suo centroide (la media). Si usa anche la dispersione entro i cluster non divisa per NN: WK=∑k∑x∈Ck∥x−μk∥2W_K=\sum_k\sum_{x\in C_k}\lVert x-\mu_k\rVert^2 (inerzia).

Perché l'algoritmo funziona (non sale mai). Ciascuno dei due passi fa diminuire (o lascia uguale) WW:

Esempio svolto. Sette punti: A(1,1)(1,1), B(1,5;2)(1{,}5;2), C(3,4)(3,4), D(5,7)(5,7), E(3,5;5)(3{,}5;5), F(4,5;5)(4{,}5;5), G(3,5;4,5)(3{,}5;4{,}5) con K=2K=2 e centroidi iniziali A e D.

  • Assegnazione 1. Distanze da c1=(1,1)c_1=(1,1) e c2=(5,7)c_2=(5,7): A (0; 7,21)→1(0;\,7{,}21)\to1; B (1,12; 6,10)→1(1{,}12;\,6{,}10)\to1; C (3,61; 3,61)(3{,}61;\,3{,}61) pareggio, assegnato al primo →1\to1; D (7,21; 0)→2(7{,}21;\,0)\to2; E (4,72; 2,50)→2(4{,}72;\,2{,}50)\to2; F (5,32; 2,06)→2(5{,}32;\,2{,}06)\to2; G (4,30; 2,92)→2(4{,}30;\,2{,}92)\to2.
  • Aggiornamento 1. c1=media(A,B,C)=(1+1,5+33,1+2+43)=(1,833; 2,333)c_1=\text{media}(A,B,C)=(\frac{1+1{,}5+3}3,\frac{1+2+4}3)=(1{,}833;\,2{,}333); c2=media(D,E,F,G)=(5+3,5+4,5+3,54,7+5+5+4,54)=(4,125; 5,375)c_2=\text{media}(D,E,F,G)=(\frac{5+3{,}5+4{,}5+3{,}5}4,\frac{7+5+5+4{,}5}4)=(4{,}125;\,5{,}375). W=12,21W=12{,}21.
  • Assegnazione 2. C è ora più vicino a c2c_2 (distanza da c1c_1: 1,1672+1,6672=2,03\sqrt{1{,}167^2+1{,}667^2}=2{,}03; da c2c_2: 1,1252+1,3752=1,78\sqrt{1{,}125^2+1{,}375^2}=1{,}78). Nuovi cluster: {A,B}\{A,B\} e {C,D,E,F,G}\{C,D,E,F,G\}. Centroidi (1,25; 1,5)(1{,}25;\,1{,}5) e (3,9; 5,1)(3{,}9;\,5{,}1), W=8,525W=8{,}525.
  • 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 (0,0),(0,1),(4,0),(4,1)(0,0),(0,1),(4,0),(4,1) con K=2K=2. Se i centroidi iniziali sono (0,0)(0,0) e (0,1)(0,1), il punto (4,0)(4,0) è più vicino al primo e (4,1)(4,1) al secondo: i cluster sono {(0,0),(4,0)}\{(0,0),(4,0)\} e {(0,1),(4,1)}\{(0,1),(4,1)\} con centroidi (2;0)(2;0) e (2;1)(2;1), e l'algoritmo è già fermo con W=4⋅4=16W=4\cdot4=16. La soluzione migliore (sinistra e destra) ha centroidi (0;0,5)(0;0{,}5) e (4;0,5)(4;0{,}5) e W=4⋅0,25=1W=4\cdot0{,}25=1. 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 nn punti e centroide μ\mu e arriva un nuovo punto xx assegnato a quel cluster, μnew=n μ+xn+1=μ+x−μn+1,n←n+1,\mu_{\text{new}}=\frac{n\,\mu+x}{n+1}=\mu+\frac{x-\mu}{n+1},\qquad n\leftarrow n+1, (la seconda forma si ottiene scrivendo nμ+x=(n+1)μ+(x−μ)n\mu+x=(n+1)\mu+(x-\mu)). Basta quindi tenere in memoria solo i KK centroidi e i KK contatori nkn_k (k-means online). Una variante intermedia, il k-means a buffer, tiene al massimo M=m×KM=m\times K punti campionati e ricalcola i centroidi solo da quelli. Esempio: centroide (1;1)(1;1) con n=3n=3 punti e nuovo punto (5;5)(5;5): μnew=3(1;1)+(5;5)4=(2;2)\mu_{\text{new}}=\frac{3(1;1)+(5;5)}4=(2;2).

Quanti cluster?

Il numero KK non è noto a priori.

Metodo del gomito

Al crescere di KK la dispersione entro i cluster diminuisce sempre (più cluster adattano meglio i dati: per K=NK=N è zero), ma dopo un certo punto il guadagno è marginale e i nuovi cluster si limitano a sovradattare. Il «gomito» del grafico WKW_K (o dell'errore medio) contro KK è il punto in cui il miglioramento comincia ad appiattirsi.

Esempio (laboratorio: 1000 punti in cinque gruppi gaussiani, deviazione standard 1,51{,}5, centri (−10,−15)(-10,-15), (0,0)(0,0), (10,−15)(10,-15), (25,−5)(25,-5), (10,15)(10,15)). MSEwithin\mathrm{MSE}_{\text{within}} per K=1,…,8K=1,\dots,8: 264,5; 136,7; 67,8; 36,0; 4,28; 3,95; 3,66; 3,45264{,}5;\ 136{,}7;\ 67{,}8;\ 36{,}0;\ 4{,}28;\ 3{,}95;\ 3{,}66;\ 3{,}45. Dopo K=5K=5 il calo è minimo: gomito a K=5K=5.

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?»

  1. Per ogni KK (per esempio da 1 a 10) si esegue il k-means sui dati reali e si calcola la dispersione WK=∑k=1K∑x∈Ck∥x−μk∥2W_K=\sum_{k=1}^K\sum_{x\in C_k}\lVert x-\mu_k\rVert^2.
  2. Si generano nrefn_{\text{ref}} 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.
  3. Si esegue il k-means su ciascuno e si calcola WKrefW_K^{\text{ref}}.
  4. Gap(K)=E[log⁡WKref]−log⁡WK\displaystyle\mathrm{Gap}(K)=\mathbb E\big[\log W_K^{\text{ref}}\big]-\log W_K: più alto è il gap, migliore è il clustering rispetto al caso. Si usa il logaritmo perché interessa il rapporto tra le due dispersioni.
  5. Si sceglie il più piccolo KK tale che Gap(K)≥Gap(K+1)−sK+1\mathrm{Gap}(K)\ge\mathrm{Gap}(K+1)-s_{K+1}, dove sK+1s_{K+1} è la deviazione standard dei log⁡Wref\log W^{\text{ref}} (tiene conto dell'incertezza dei dati casuali).

Esempio (stessi cinque gruppi). Gap per K=1,…,6K=1,\dots,6: 0,04; 0,16; 0,41; 0,64; 2,60; 2,470{,}04;\ 0{,}16;\ 0{,}41;\ 0{,}64;\ 2{,}60;\ 2{,}47 (laboratorio). Per K=4K=4: 0,64≥2,60−s0{,}64\ge2{,}60-s? No. Per K=5K=5: 2,60≥2,47−s62{,}60\ge2{,}47-s_6 sì: si sceglie K=5K=5. (Una replica indipendente con 10 dataset di riferimento ha dato 0,02; 0,13; 0,41; 0,62; 2,56; 2,450{,}02;\ 0{,}13;\ 0{,}41;\ 0{,}62;\ 2{,}56;\ 2{,}45.)

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 mm cluster). Con nn campioni e mm cluster desiderati servono n−mn-m iterazioni, perché a ogni fusione il numero di cluster diminuisce di uno.

Distanza tra cluster (linkage). Per due cluster Ci,CjC_i,C_j:

  • single linkage (distanza minima): d(Ci,Cj)=min⁡a∈Ci, b∈Cjd(a,b)d(C_i,C_j)=\min_{a\in C_i,\,b\in C_j}d(a,b);
  • complete linkage (distanza massima): max⁡a,bd(a,b)\max_{a,b}d(a,b);
  • average linkage (distanza media): 1∣Ci∣∣Cj∣∑a∈Ci∑b∈Cjd(a,b)\frac1{|C_i||C_j|}\sum_{a\in C_i}\sum_{b\in C_j}d(a,b);
  • Ward: fonde la coppia che aumenta meno la varianza totale entro i cluster.

Esempio svolto (average e single linkage). Sei punti P0=(1,2)P_0=(1,2), P1=(5,8)P_1=(5,8), P2=(1,1)P_2=(1,1), P3=(2,3)P_3=(2,3), P4=(1,5;1,8)P_4=(1{,}5;1{,}8), P5=(5;6,5)P_5=(5;6{,}5) e distanza euclidea. Ordine delle fusioni con average linkage (distanza di fusione tra parentesi): {P0,P4}\{P_0,P_4\} (0,539)(0{,}539); poi {P0,P4}\{P_0,P_4\} con P2P_2 (0,972)(0{,}972); {P1,P5}\{P_1,P_5\} (1,50)(1{,}50); {P0,P4,P2}\{P_0,P_4,P_2\} con P3P_3 (1,65)(1{,}65); infine i due gruppi {P0,P2,P3,P4}\{P_0,P_2,P_3,P_4\} e {P1,P5}\{P_1,P_5\} (6,44)(6{,}44). Con single linkage le distanze sono 0,539; 0,943; 1,30; 1,50; 4,610{,}539;\ 0{,}943;\ 1{,}30;\ 1{,}50;\ 4{,}61: 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 (i,j)(i,j) è l'etichetta del cluster del campione jj all'iterazione ii (la riga ii contiene n−in-i cluster); la riga iniziale è [0,1,…,n−1][0,1,\dots,n-1]. 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 K=2K=2). Per ottenere mm cluster servono m−1m-1 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 nn grande.

Codice

python
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 KK minimizzando l'errore entro i cluster: cala sempre, e per K=NK=N 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 Gap\mathrm{Gap} con il segno invertito: si sottrae log⁡WK\log W_K dei dati reali dalla media dei log⁡Wref\log W^{\text{ref}}.
  • Contare male le iterazioni agglomerative: servono n−mn-m fusioni per mm 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 KK; centroidi iniziali = KK 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(1,1)(1,1), B(1,5;2)(1{,}5;2), C(3,4)(3,4), D(5,7)(5,7), E(3,5;5)(3{,}5;5), F(4,5;5)(4{,}5;5), G(3,5;4,5)(3{,}5;4{,}5), centroidi iniziali A e D: dopo 2 aggiornamenti cluster {A,B}\{A,B\} e {C,D,E,F,G}\{C,D,E,F,G\}, centroidi (1,25;1,5)(1{,}25;1{,}5) e (3,9;5,1)(3{,}9;5{,}1), W=8,525W=8{,}525.

Formula. MSEwithin=1N∑k∑xi∈Ck∥xi−μk∥2\mathrm{MSE}_{\text{within}}=\frac1N\sum_k\sum_{x_i\in C_k}\lVert x_i-\mu_k\rVert^2; WKW_K = stessa somma senza 1N\frac1N. Per un cluster fissato la media minimizza la somma dei quadrati (∇=0\nabla=0).

Convergenza. WW non cresce a nessun passo e le partizioni sono finite ⇒\Rightarrow converge, ma a un minimo locale (dipende dall'inizializzazione: rettangolo (0,0),(0,1),(4,0),(4,1)(0,0),(0,1),(4,0),(4,1), W=16W=16 contro 11); si rilancia più volte. Adatto a gruppi compatti e sferici; feature standardizzate.

Media incrementale (online): μnew=nμ+xn+1=μ+x−μn+1\mu_{\text{new}}=\frac{n\mu+x}{n+1}=\mu+\frac{x-\mu}{n+1}: bastano KK centroidi e KK contatori. Variante a buffer: al più M=m⋅KM=m\cdot K punti.

Numero di cluster. Gomito: WKW_K cala sempre, si cerca dove rallenta (5 gruppi: 264,5;136,7;67,8;36,0;4,28;…264{,}5;136{,}7;67{,}8;36{,}0;4{,}28;\dots, gomito a K=5K=5). Gap statistic: dataset di riferimento uniformi con stessi limiti; Gap(K)=E[log⁡WKref]−log⁡WK\mathrm{Gap}(K)=E[\log W_K^{\text{ref}}]-\log W_K; si prende il più piccolo KK con Gap(K)≥Gap(K+1)−sK+1\mathrm{Gap}(K)\ge\mathrm{Gap}(K+1)-s_{K+1} (esempio: K=5K=5).

Gerarchico. Dendrogramma (altezza = distanza di fusione), si taglia a un livello. Agglomerativo: un cluster per punto, si fondono i due più vicini; n−mn-m iterazioni per mm cluster. Linkage: single min⁡d(a,b)\min d(a,b), complete max⁡\max, average 1∣Ci∣∣Cj∣∑d(a,b)\frac1{|C_i||C_j|}\sum d(a,b), Ward. Single segue forme allungate (ma effetto catena). Divisivo: si divide il cluster più disperso (es. con k-means, K=2K=2); m−1m-1 divisioni.

Esempio. Sei punti, average linkage: fusioni a 0,539;0,972;1,50;1,65;6,440{,}539;0{,}972;1{,}50;1{,}65;6{,}44.

Errori tipici: KK scelto minimizzando WW; una sola inizializzazione; niente standardizzazione; n−mn-m contato male.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata