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).
Você também pode tentar um método mais recente: A. Kalogeratos e A.Likas, Dip-means: um método de cluster incremental para estimar o número de clusters , NIPS 2012.
A idéia é usar o teste estatístico de hipóteses para a unimodalidade em vetores contendo a semelhança / distância entre um ponto e o restante dos pontos do conjunto. O teste é feito usando o teste de mergulho Hartigan-Hartigan , Ann. Statist. 13 (1): 70-84.
O método começa com todo o conjunto de dados como um cluster e o divide gradualmente, desde que a hipótese de unimodalidade seja rejeitada (ou seja, mais de um cluster esteja presente).
Portanto, esse método indica se há mais de um cluster nos dados (sua pergunta), mas pode fornecer também o cluster final.
Aqui você pode encontrar algum código no Matlab .
fonte
Suponha que eu esteja considerando o mesmo exemplo,
Como subconjunto de elementos de clusters correspondentes à melhor solução de clustering com base nas estatísticas de gap máximo? Para que eu possa usá-lo para uma análise mais aprofundada em cada um dos clusters.
Eu sei que existe um comando chamado subconjunto. Não há problemas ao usar este comando quando fornecemos o número de clusters que queremos. Mas como fazer o subconjunto quando queremos fazer o subconjunto com base no k ideal obtido usando gap (em resumo, subconjuntos de elementos de clusters, se houver um loop)
fonte