Sobre o k-means especificamente, você pode usar as estatísticas do Gap. Basicamente, a idéia é calcular uma boa medida de agrupamento com base na dispersão média em comparação com uma distribuição de referência para um número crescente de clusters. Mais informações podem ser encontradas no artigo original:
Tibshirani, R., Walther, G. e Hastie, T. (2001). Estimando o número de clusters em um conjunto de dados por meio da estatística de gap . JR Statist. Soc. B, 63 (2): 411-423.
A resposta que forneci a uma pergunta relacionada destaca outros índices gerais de validade que podem ser usados para verificar se um determinado conjunto de dados exibe algum tipo de estrutura.
Quando você não tem idéia do que você esperaria encontrar se houvesse apenas ruído, uma boa abordagem é usar a reamostragem e estudar a estabilidade dos clusters. Em outras palavras, resample seus dados (via bootstrap ou adicionando pouco ruído) e calcule a "proximidade" das partições resultantes, conforme medido pelas semelhanças de Jaccard . Em resumo, permite estimar a frequência com que clusters semelhantes foram recuperados nos dados. Este método está prontamente disponível no pacote fpc R como clusterboot()
. Ele assume como entrada dados brutos ou uma matriz de distância e permite aplicar uma ampla variedade de métodos de agrupamento (métodos hierárquicos, k-means, fuzzy). O método é discutido nas referências vinculadas:
Hennig, C. (2007) Avaliação em cluster da estabilidade de cluster .
Estatística Computacional e Análise de Dados , 52, 258-271.
Hennig, C. (2008) Ponto de dissolução e robustez do isolamento: critérios de robustez para métodos gerais de análise de agrupamentos . Journal of Multivariate Analysis , 99, 1154-1176.
Abaixo está uma pequena demonstração com o algoritmo k-means.
sim.xy <- function(n, mean, sd) cbind(rnorm(n, mean[1], sd[1]),
rnorm(n, mean[2],sd[2]))
xy <- rbind(sim.xy(100, c(0,0), c(.2,.2)),
sim.xy(100, c(2.5,0), c(.4,.2)),
sim.xy(100, c(1.25,.5), c(.3,.2)))
library(fpc)
km.boot <- clusterboot(xy, B=20, bootmethod="boot",
clustermethod=kmeansCBI,
krange=3, seed=15555)
Os resultados são bastante positivos nesse conjunto de dados artificial (e bem estruturado), pois nenhum dos três clusters ( krange
) foi dissolvido entre as amostras, e a similaridade média do Jaccard em cluster é> 0,95 para todos os clusters.
Abaixo estão os resultados nas 20 amostras de inicialização. Como pode ser visto, as unidades estatísticas tendem a ficar agrupadas no mesmo cluster, com poucas exceções para as observações intermediárias.
Você pode estender essa idéia a qualquer índice de validade, é claro: escolha uma nova série de observações por autoinicialização (com substituição), calcule sua estatística (por exemplo, largura da silhueta, correlação copenética, gama de Hubert, dentro da soma dos quadrados) para uma variedade de números de cluster (por exemplo, 2 a 10), repita 100 ou 500 vezes e observe o gráfico de caixa da sua estatística como uma função do número de cluster.
Aqui está o que eu recebo com o mesmo conjunto de dados simulado, mas usando o agrupamento hierárquico de Ward e considerando a correlação copenética (que avalia como a informação de distância é reproduzida nas partições resultantes) e a largura da silhueta (uma medida combinada que avalia a homogeneidade intra-cluster e inter- separação de cluster).
A correlação copenética varia de 0,6267 a 0,7511 com um valor mediano de 0,7031 (500 amostras de autoinicialização). A largura da silhueta parece ser máxima quando consideramos três grupos (mediana 0,8408, intervalo 0,7371-0,8769).