A estatística de gap é uma ótima maneira de fazer isso; Tibshirani, Hastie e Walther (2001).
http://stat.ethz.ch/R-manual/R-devel/library/cluster/html/clusGap.html - O pacote R relevante.
A idéia é que ele execute um teste de hipótese seqüencial de agrupar seus dados para K = 1,2,3, ... vs uma hipótese nula de ruído aleatório, que é equivalente a um cluster. Sua força particular é que ele fornece uma indicação confiável se K = 1, ou seja, se não há clusters.
Aqui está um exemplo: eu estava inspecionando alguns dados de astronomia alguns dias atrás, como acontece - a partir de uma pesquisa em trânsito de exoplanetas. Eu queria saber que evidências existem para clusters (convexos). Meus dados são 'trânsito'
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;
}
Com a estatística de gap, você está procurando o primeiro valor de K onde o teste 'falha', ou seja, a estatística de gap diminui significativamente. O loop acima imprimirá esse ak, no entanto, a simples plotagem de cgap fornece a seguinte figura:
Veja como há uma queda significativa no intervalo de k = 1 a k = 2, o que significa que na verdade não há clusters (ou seja, 1 cluster).