La statistica gap è un ottimo modo per farlo; Tibshirani, Hastie & Walther (2001).
http://stat.ethz.ch/R-manual/R-devel/library/cluster/html/clusGap.html - Il pacchetto R pertinente.
L'idea è che esegue un test sequenziale di ipotesi di raggruppamento dei dati per K = 1,2,3, ... rispetto a un'ipotesi nulla di rumore casuale, che equivale a un cluster. Il suo punto di forza è che ti dà un'indicazione affidabile se K = 1, cioè se non ci sono cluster.
Ecco un esempio, alcuni giorni fa stavo ispezionando alcuni dati astronomici, in particolare da un sondaggio in transito sull'esopianeta. Volevo sapere quali prove ci sono per i cluster (convessi). I miei dati sono "transito"
library(cluster)
cgap <- clusGap(transit, FUN=kmeans, K.max=kmax, B=100)
for(k in 1:(kmax-1)) {
if(cgap$Tab[k,3]>cgap$Tab[(k+1),3]-cgap$Tab[(k+1),4]) {print(k)};
break;
}
Con la statistica del gap stai cercando il primo valore di K in cui il test "fallisce", cioè la statistica del gap scende significativamente. Il ciclo qui sopra stamperà tale ak, tuttavia la semplice stampa di cgap ti dà la seguente figura:
Guarda come c'è un calo significativo nel Gap da k = 1 a k = 2, che significa che in realtà non ci sono cluster (cioè 1 cluster).