Vai al contenuto principale

Silhouette Score: come valutare la qualità del clustering

Una guida pratica al silhouette score, con formula, intervalli di interpretazione, un esempio con scikit-learn, come usarlo per scegliere il numero giusto di cluster e come si confronta con altre metriche di clustering.
Aggiornato 31 lug 2026  · 12 min leggi

Esplora con l'AI

Apri in ChatGPTApri in ClaudeApri in Perplexity

Dopo aver addestrato un modello di clustering, come fai a sapere se i cluster sono validi?

Non esiste una risposta universale. Nel machine learning supervisionato tradizionale, puoi confrontare le previsioni con le etichette reali e ottenere un numero di accuratezza. Con il clustering questo non è possibile. Hai scelto k=5, ma un valore diverso di k sarebbe migliore? Senza etichette, non puoi dire se l'algoritmo ha trovato la struttura o ha semplicemente diviso i dati in pezzi casuali.

Il silhouette score è la metrica che stai cercando. Mostra quanto bene ogni punto si adatta al cluster assegnato rispetto a quello più vicino successivo, ed è una delle metriche più usate. Funziona senza etichette ed è facile da interpretare.

In questo articolo, ti guiderò attraverso la formula e come leggerla, ti mostrerò un esempio in Python con scikit-learn e tratterò gli scenari in cui è o non è una soluzione ideale.

Nuovo al clustering? Leggi il nostro tutorial Introduzione al clustering k-Means con scikit-learn per capire come funziona l'algoritmo e come usarlo in Python. 

Cos'è il Silhouette Score?

Il silhouette score è un numero compreso tra -1 e 1 che indica quanto bene ogni punto si adatta al suo cluster.

Il numero ti mostra due cose:

  1. Quanto è vicino un punto agli altri punti del proprio cluster
  2. Quanto è lontano dal cluster più vicino a cui non appartiene

Se il punto è ben dentro il proprio gruppo e lontano da qualsiasi altro, il punteggio è alto. Se è sul bordo, più vicino a un cluster vicino che al proprio, il punteggio è basso.

In poche parole, questo è l'equilibrio che il silhouette score ti mostra. Considera sia quanto strettamente i punti sono raggruppati all'interno di ciascun cluster, sia quanto i cluster sono separati tra loro. Entrambi sono ugualmente rilevanti. Un clustering che raggruppa bene i punti ma posiziona i cluster uno sopra l'altro non è utile, e nemmeno un clustering che separa bene i cluster ma disperde i punti al loro interno.

Cluster ben separati rispetto a cluster sovrapposti

Cluster ben separati rispetto a cluster sovrapposti

Punteggi più alti indicano cluster meglio definiti. Un punteggio vicino a 1 significa che i punti sono stretti all'interno del loro cluster e lontani dagli altri. Un punteggio vicino a 0 significa che i cluster si sovrappongono o che i confini sono ambigui. Un punteggio negativo significa che il punto è più vicino a un cluster diverso da quello a cui è stato assegnato.

Come funziona il Silhouette Score?

Ogni punto ottiene il proprio silhouette score, e quel punteggio deriva da due distanze.

La prima è quanto il punto è lontano dagli altri punti nel proprio cluster assegnato, in media. Se è piccola, il punto è vicino agli altri del cluster. Se è grande, il punto è debolmente legato al suo cluster.

La seconda è quanto il punto è lontano dai punti nel cluster vicino più prossimo, in media. Se è grande, il punto è chiaramente separato dagli altri cluster. Se è piccola, il punto è vicino al confine.

Distanza di un punto dai cluster

Distanza di un punto dai cluster

Il valore di silhouette confronta questi due numeri. Un punto ben dentro il suo cluster e lontano da qualsiasi altro ottiene un punteggio alto. Un punto sul bordo (vicino a un altro cluster) ottiene un punteggio basso. Un punto più vicino a un cluster diverso dal proprio ottiene un punteggio negativo.

Da ricordare che nessuna delle due distanze, da sola, è sufficiente. 

Un cluster compatto può trovarsi proprio accanto a un altro. Un cluster ben separato può essere internamente disperso. Ti servono entrambe le distanze per fidarti dell'assegnazione.

Formula del Silhouette Score

Ecco la formula per un singolo punto:

Formula del silhouette score

Formula del silhouette score

Dove:

  • a è la distanza media dal punto a tutti gli altri punti nello stesso cluster

  • b è la distanza media dal punto a tutti i punti nel cluster vicino più prossimo

La formula divide il divario tra b e a per il maggiore tra i due. 

In generale, puoi usare queste linee guida per interpretare il punteggio:

  • Quando b è molto maggiore di a: Il punto è lontano da qualsiasi altro cluster e vicino al proprio. Il numeratore è vicino a b, il denominatore è anch'esso b e il punteggio è vicino a 1

  • Quando a è molto maggiore di b: Il punto è più vicino a un altro cluster che al proprio. Il numeratore è un grande numero negativo vicino a -a, il denominatore è a e il punteggio è vicino a -1

  • Quando a e b sono pressappoco uguali: Il punto è sul confine tra due cluster. Il numeratore è vicino a 0, e così anche il punteggio

Maggiori dettagli a seguire.

Come interpretare il Silhouette Score

Ecco una guida approssimativa per leggere il silhouette score:

  • Vicino a 1: I punti sono ben dentro i loro cluster e lontani da tutti gli altri
  • Intorno a 0,7: Buon clustering, i gruppi sono distinti e i punti sono vicini agli altri punti del loro cluster
  • Intorno a 0,5: Clustering ragionevole, c'è un po' di sovrapposizione tra cluster, ma restano distinguibili
  • Vicino a 0: I cluster si sovrappongono o i confini non sono chiari. La struttura potrebbe non essere reale
  • Sotto 0: I punti sono più vicini al cluster sbagliato. Questo può accadere quando scegli il numero sbagliato di cluster o quando i dati, in partenza, non si prestano bene al clustering.

Le soglie sopra sono solo indicazioni di massima. Cosa sia un buon silhouette score dipende dal dataset.

Dati sparsi e ad alta dimensionalità producono spesso punteggi più bassi anche quando i cluster sono buoni. Dati densi e ben separati possono produrre punteggi superiori a 0,7. Dovresti confrontare i punteggi tra modelli sullo stesso dataset, non rispetto a una soglia universale.

Come calcolare il Silhouette Score

Calcoli il silhouette score un punto alla volta. Ecco come funziona per un singolo punto.

Passaggio 1: Calcola a, la distanza media dal punto a ogni altro punto del suo cluster. Se il punto è in un cluster con altri 4 punti e le distanze verso quei punti sono 1.2, 1.5, 1.0 e 1.3:

Calcolo del silhouette score (1)

Calcolo del silhouette score (1)

Passaggio 2: Trova il cluster vicino più prossimo (quello, diverso da quello del punto, con la distanza media più bassa dal punto). Poi calcola b, la distanza media dal punto a ogni punto di quel cluster. Se il cluster più vicino ha 5 punti a distanze 2.4, 2.8, 3.0, 2.6 e 2.7:

Calcolo del silhouette score (2)

Calcolo del silhouette score (2)

Passaggio 3: Inserisci a e b nella formula:

Calcolo del silhouette score (3)

Calcolo del silhouette score (3)

Passaggio 4: Ripeti per ogni punto del dataset. Il silhouette score complessivo per il clustering è la media di tutti i punteggi dei punti.

Esempio di Silhouette Score in Python

Scikit-learn ti fornisce due funzioni per calcolare il silhouette score, entrambe in sklearn.metrics:

  • silhouette_score() restituisce il punteggio medio per l'intero clustering

  • silhouette_samples() restituisce il punteggio per ogni singolo punto

Ecco come usarle con KMeans su un dataset sintetico:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples

# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)

# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")

# Per-point silhouette values
sample_scores = silhouette_samples(X, labels)
print(f"First 5 point scores: {sample_scores[:5]}")

Otterrai questo output eseguendo lo snippet di codice sopra:

Output dell'esempio in Python

Output dell'esempio in Python

Il punteggio complessivo di 0,791 significa che i quattro cluster sono ben definiti e separati.

I punteggi per singolo punto ti permettono di analizzare ogni dato.

I punti con punteggi individuali alti sono ben dentro i loro cluster. I punti con punteggi bassi o negativi sono sul confine o mal assegnati, il che è utile per individuare outlier o rivedere i punti borderline.

Scegliere il numero ottimale di cluster

Uno degli usi più comuni del silhouette score è scegliere il k giusto per KMeans. 

Far lo include tre passaggi:

  1. Adatta KMeans per un intervallo di valori di k
  2. Calcola il silhouette score per ogni fit
  3. Scegli il k con il punteggio più alto

Ecco il codice:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score

X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
k_values = range(2, 11)
scores = []
for k in k_values:
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    labels = kmeans.fit_predict(X)
    scores.append(silhouette_score(X, labels))
    print(f"k={k}: silhouette = {scores[-1]:.3f}")

Questo è il punteggio che vedrai per ogni k:

Silhouette score per diversi valori di k

Silhouette score per diversi valori di k

Il punteggio più alto è a k=4. È il valore che vorresti scegliere.

Ricorda che il silhouette score non sostituisce la conoscenza del dominio. Se il tuo problema di business richiede 5 segmenti di clienti e il silhouette è più alto a 4, non scegliere automaticamente 4. La metrica ti mostra dove i dati hanno la struttura più pulita, ma a volte il numero giusto di cluster è quello che corrisponde a qualcosa di significativo per il tuo problema.

Silhouette Score vs. altre metriche di clustering

Il silhouette score è probabilmente la metrica più comune per valutare il clustering, ma non è l'unica. Ecco come si confronta con le alternative.

Silhouette score vs. metodo del gomito

Il metodo del gomito è una tecnica visiva per scegliere k in KMeans. Adatti modelli per un intervallo di valori di k, tracci l'inerzia (somma dei quadrati intra-cluster) rispetto a k e scegli il valore in cui la curva ha una piega netta.

Il metodo del gomito ha il vantaggio di essere veloce e facile da eseguire. Ma il "gomito" non è sempre evidente. Con dati disordinati, la curva può sembrare liscia e non riesci a capire dove si piega.

Il silhouette score ti dà un numero effettivo per ogni k, così puoi fare un confronto più significativo. È più lento da calcolare, ma non lascia la decisione all'interpretazione visiva.

Usa il metodo del gomito per un controllo rapido. Usa il silhouette score quando ti serve una risposta affidabile.

Silhouette score vs. indice di Davies-Bouldin

L'indice di Davies-Bouldin (DBI) misura la somiglianza media tra ciascun cluster e quello a lui più simile. Un DBI più basso significa un clustering migliore e un punteggio perfetto è 0.

Il DBI usa i centroidi dei cluster per calcolare la somiglianza, il che lo rende più veloce da calcolare rispetto al silhouette score su dataset di grandi dimensioni. Inoltre segue un'intuizione simile nel premiare cluster compatti e ben separati.

Il rovescio della medaglia è che il DBI ti dice solo qualcosa sul clustering nel suo insieme. Il silhouette score ti dà anche un punteggio per punto, così puoi trovare i punti borderline e gli outlier.

Usa il DBI se lavori con dataset grandi e la velocità conta. Usa il silhouette score quando vuoi analizzare i singoli punti.

Silhouette score vs. indice di Calinski-Harabasz

L'indice di Calinski-Harabasz (CH), detto anche criterio del rapporto di varianza, è il rapporto tra dispersione tra cluster e dispersione intra-cluster. Punteggi più alti indicano un clustering migliore e il punteggio non ha un limite superiore.

Il CH è veloce e funziona bene su dataset grandi perché coinvolge solo statistiche a livello di cluster. Come silhouette e DBI, funziona meglio su cluster convessi e ben separati.

Il CH inoltre non ha una scala naturale, quindi puoi confrontare i punteggi CH solo tra modelli sullo stesso dataset, non tra dataset diversi.

Usa il CH quando il tuo dataset è grande e ti servono risultati rapidi. Usa il silhouette score quando vuoi interpretabilità e insight sui singoli punti dati.

Metriche di clustering interne vs. esterne

Le metriche sopra (silhouette, DBI, CH, gomito) sono tutte metriche interne. Valutano il clustering usando solo i dati, senza etichette di verità a terra. Questo le rende la scelta standard per i problemi di clustering reali, dove le etichette non esistono.

Le metriche esterne confrontano le assegnazioni dei cluster con etichette note. L'Adjusted Rand Index (ARI), la Normalized Mutual Information (NMI) e l'omogeneità sono esempi comuni. Si usano quando hai etichette e vuoi testare quanto bene un algoritmo di clustering le riproduce.

Usa metriche interne quando non hai etichette, che è il caso tipico. Usa metriche esterne quando stai facendo benchmark di algoritmi di clustering su dati etichettati.

Ecco un riepilogo delle metriche a confronto:

Metodo Intervallo Valore migliore Velocità Usalo per
Silhouette score -1 a 1 Vicino a 1 Lento su dataset grandi Interpretabilità e insight per punto
Metodo del gomito 0 a infinito Cerca il gomito Veloce Verifiche rapide
Indice di Davies-Bouldin 0 a infinito Vicino a 0 Veloce Dataset grandi
Indice di Calinski-Harabasz 0 a infinito Più alto è, meglio è Veloce Dataset grandi e senza etichette

Silhouette score a confronto con le alternative

Limitazioni del Silhouette Score

Il silhouette score ha alcune limitazioni da conoscere:

  • Presuppone clustering basato sulla distanza: Il silhouette score è basato sulla distanza euclidea per impostazione predefinita. Funziona bene per KMeans e altri algoritmi basati sul centroide, ma non si adatta a metodi basati sulla densità come DBSCAN, in cui i cluster hanno forme arbitrarie e nessun chiaro centroide
  • Funziona meglio con cluster piccoli e ben separati: La metrica premia cluster compatti, sferici e distanti tra loro. Se i tuoi dati hanno cluster vicini o sovrapposti, il punteggio sarà basso anche se il clustering è corretto
  • Non è l'ideale con forme di cluster irregolari: I cluster reali non sono sempre convessi. Se non è il caso dei tuoi dati, i cluster ottengono punteggi di silhouette bassi anche quando le assegnazioni sono corrette
  • Costo computazionale su dataset grandi: Calcolare il silhouette score richiede distanze a coppie tra punti, che scalano come O(n^2). Su dataset con milioni di punti, diventa costoso
  • Sensibilità alla metrica di distanza scelta: Il punteggio cambia a seconda che tu usi distanza euclidea, Manhattan, coseno o un'altra distanza. Se i tuoi dati non seguono le assunzioni euclidee, il silhouette score può trarti in inganno

Best practice per usare il Silhouette Score

Il silhouette score funziona al meglio se segui alcune pratiche di base:

  • Confronta più soluzioni di clustering: Non calcolare un solo silhouette score. Dovresti addestrare modelli di clustering con diversi valori di k (o con algoritmi diversi) e confrontarne i punteggi fianco a fianco
  • Visualizza i cluster insieme al punteggio: Un numero da solo non racconta tutta la storia. Traccia i tuoi cluster e verifica se le forme hanno senso
  • Non ottimizzare solo per il punteggio più alto: Il silhouette score più alto non è sempre la risposta giusta. Un clustering con k=2 ha spesso un punteggio più alto di k=5 anche quando 5 cluster sono significativi per il tuo problema
  • Combina con la conoscenza del dominio: Il punteggio ti indica dove i dati hanno la struttura più pulita. La conoscenza del dominio ti dice quale struttura è davvero utile. Usali entrambi
  • Valuta più metriche di clustering: Silhouette, DBI, CH e altre metriche misurano la qualità del clustering in modo diverso. Quando concordano, sei sulla strada giusta; quando non concordano, guarda i dati

Conclusione

Il silhouette score è uno dei modi più intuitivi per valutare il clustering perché mostra sia quanto strettamente i punti sono raggruppati sia quanto i cluster sono separati. 

Lo calcoli punto per punto, fai la media dei risultati e ottieni un singolo numero tra -1 e 1. Punteggi più vicini a 1 indicano cluster meglio definiti, e punteggi vicini o inferiori a 0 indicano che la struttura non è davvero una struttura.

Ma il silhouette score è solo un inizio. Dovresti affiancarlo a visualizzazioni dei cluster e, soprattutto, alla tua conoscenza del dominio del problema. Solo quando tutti questi elementi puntano nella stessa direzione puoi fidarti del risultato.

Il silhouette score fa parte del quadro più ampio di Unsupervised Learning in Python. Iscriviti oggi e impara a raggruppare, trasformare, visualizzare ed estrarre insight da dati senza etichette.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Senior Data Scientist con base in Croazia. Top Tech Writer con oltre 700 articoli pubblicati, per più di 10 milioni di visualizzazioni. Autore del libro Machine Learning Automation with TPOT.
Argomenti

Impara con DataCamp

Corso

Cluster Analysis in R

4 h
44.1K
Develop a strong intuition for how hierarchical and k-means clustering work and learn how to apply them to extract insights from your data.
Vedi dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow