Escolhendo clusters para k-means: o caso de 1 cluster

9

Alguém conhece um bom método para determinar se o agrupamento usando kmeans é apropriado? Ou seja, e se sua amostra for realmente homogênea? Eu sei que algo como um modelo de mistura (via mclust em R) fornecerá estatísticas de ajuste para o caso de cluster 1: k, mas parece que todas as técnicas para avaliar kmeans requerem pelo menos dois clusters.

Alguém conhece uma técnica para comparar os casos de cluster 1 e 2 para kmeans?

dmartin
fonte

Respostas:

10

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:
insira a descrição da imagem aqui 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).

Jack
fonte
como fazer o mesmo para clustering hierárquico com ligação única? Você pode, por favor, explicar o argumento FUN do clusGap? Corri a linha abaixo para kmax hierárquico = 20 cgap <- clusGap (cluster_feat_base [, 2: ncol (cluster_feat_base)]], FUN = hclust, K.max = kmax, B = 100). Mas está dando um erro dizendo Erro no FUNcluster (X, kk, ...): método de cluster inválido 2
GeorgeOfTheRF 13/16/16
4

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 .

argyris
fonte
0

Suponha que eu esteja considerando o mesmo exemplo,

Tumab[k,3]>cgumap

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)

Tharang
fonte