Era tão válido executar médias k em uma matriz de distância quanto na matriz de dados (dados de mineração de texto)?


8

(Esta postagem é uma repostagem de uma pergunta que eu postei ontem (agora excluída), mas tentei reduzir o volume de palavras e simplificar o que estou perguntando)

Espero obter ajuda na interpretação de um script e saída do kmeans que criei. Isso ocorre no contexto da análise de texto. Criei esse script depois de ler vários artigos on-line sobre análise de texto. Eu vinculei a alguns deles abaixo.

Exemplo de script r e corpus de dados de texto aos quais me referirei ao longo deste post:

library(tm) # for text mining

## make a example corpus
# make a df of documents a to i
a <- "dog dog cat carrot"
b <- "phone cat dog"
c <- "phone book dog"
d <- "cat book trees"
e <- "phone orange"
f <- "phone circles dog"
g <- "dog cat square"
h <- "dog trees cat"
i <- "phone carrot cat"
j <- c(a,b,c,d,e,f,g,h,i)
x <- data.frame(j)    

# turn x into a document term matrix (dtm)
docs <- Corpus(DataframeSource(x))
dtm <- DocumentTermMatrix(docs)

# create distance matrix for clustering
m <- as.matrix(dtm)
d <- dist(m, method = "euclidean")

# kmeans clustering
kfit <- kmeans(d, 2)
#plot – need library cluster
library(cluster)
clusplot(m, kfit$cluster)

É isso para o script. Abaixo está a saída de algumas das variáveis ​​no script:

Aqui está x, o quadro de dados x que foi transformado em um corpus:

 x
                       j
    1 dog dog cat carrot
    2      phone cat dog
    3     phone book dog
    4     cat book trees
    5       phone orange
    6  phone circles dog
    7     dog cat square
    8      dog trees cat
    9   phone carrot cat

Aqui está o termo do documento resultante matrix dtm:

    > inspect(dtm)
<<DocumentTermMatrix (documents: 9, terms: 9)>>
Non-/sparse entries: 26/55
Sparsity           : 68%
Maximal term length: 7
Weighting          : term frequency (tf)

    Terms
Docs book carrot cat circles dog orange phone square trees
   1    0      1   1       0   2      0     0      0     0
   2    0      0   1       0   1      0     1      0     0
   3    1      0   0       0   1      0     1      0     0
   4    1      0   1       0   0      0     0      0     1
   5    0      0   0       0   0      1     1      0     0
   6    0      0   0       1   1      0     1      0     0
   7    0      0   1       0   1      0     0      1     0
   8    0      0   1       0   1      0     0      0     1
   9    0      1   1       0   0      0     1      0     0

E aqui está a matriz de distância d

> d
         1        2        3        4        5        6        7        8
2 1.732051                                                               
3 2.236068 1.414214                                                      
4 2.645751 2.000000 2.000000                                             
5 2.828427 1.732051 1.732051 2.236068                                    
6 2.236068 1.414214 1.414214 2.449490 1.732051                           
7 1.732051 1.414214 2.000000 2.000000 2.236068 2.000000                  
8 1.732051 1.414214 2.000000 1.414214 2.236068 2.000000 1.414214         
9 2.236068 1.414214 2.000000 2.000000 1.732051 2.000000 2.000000 2.000000

Aqui está o resultado, kfit:

> kfit
K-means clustering with 2 clusters of sizes 5, 4

Cluster means:
         1        2        3        4        5        6        7        8        9
1 2.253736 1.194938 1.312096 2.137112 1.385641 1.312096 1.930056 1.930056 1.429253
2 1.527463 1.640119 2.059017 1.514991 2.384158 2.171389 1.286566 1.140119 2.059017

Clustering vector:
1 2 3 4 5 6 7 8 9 
2 1 1 2 1 1 2 2 1 

Within cluster sum of squares by cluster:
[1] 13.3468 12.3932
 (between_SS / total_SS =  29.5 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"      

Aqui está o gráfico resultante: insira a descrição da imagem aqui

Eu tenho várias perguntas sobre isso:

  1. Ao calcular a minha matriz de distância d (um parâmetro utilizado no cálculo kfit) Eu fiz isso: d <- dist(m, method = "euclidean"). Outro artigo que encontrei fez isso: d <- dist(t(m), method = "euclidean"). Então, separadamente, em uma pergunta do SO que eu postei recentemente, alguém comentou "kmeans devem ser executados na matriz de dados, não na matriz de distância!". Presumivelmente, eles significam que kmeans()deve levar m em vez de d como entrada. Dessas 3 variações, qual / quem está "certo". Ou, supondo que todos sejam válidos de uma maneira ou de outra, qual seria a maneira convencional de configurar um modelo de linha de base inicial?
  2. Pelo que entendi, quando a função kmeans é chamada em d, o que acontece é que são escolhidos 2 centróides aleatórios (neste caso, k = 2). Então r examinará cada linha em d e determinará quais documentos estão mais próximos de qual centróide. Com base na matriz d acima, como isso seria realmente? Por exemplo, se o primeiro centróide aleatório fosse 1,5 e o segundo fosse 2, como o documento 4 seria atribuído? Na matriz d doc4 é 2.645751 2.000000 2.000000 so (em r) média (c (2.645751,2.000000,2.000000)) = 2,2; portanto, na primeira iteração de kmeans neste exemplo, doc4 é atribuído ao cluster com o valor 2, pois está mais próximo de isso do que para 1,5. Depois disso, a média do cluster é recuperada como um novo centróide e os documentos são reatribuídos quando apropriado. Isso está certo ou eu perdi completamente o ponto?
  3. Na saída do kfit acima, o que é "cluster significa"? Por exemplo, o cluster 1 do Doc3 tem um valor de 1,312096. Qual é esse número nesse contexto? [edit, desde que analisamos isso novamente alguns dias após a publicação, posso ver que é a distância de cada documento até os centros finais do cluster. Portanto, o número mais baixo (mais próximo) é o que determina qual cluster cada documento está atribuído].
  4. Na saída do kfit acima, "vetor de cluster" parece que é exatamente a qual cluster cada documento foi atribuído. ESTÁ BEM.
  5. Na saída do kfit acima, "Dentro do cluster soma dos quadrados por cluster". O que é isso? 13.3468 12.3932 (between_SS / total_SS = 29.5 %). Uma medida da variação dentro de cada cluster, presumivelmente significando que um número menor implica um agrupamento mais forte, em oposição a um número mais esparso. Essa é uma afirmação justa? E quanto ao percentual dado 29,5%. O que é isso? É 29,5% "bom". Um número menor ou maior seria preferido em qualquer caso de kmeans? Se eu experimentasse diferentes números de k, o que procuraria para determinar se o número crescente / decrescente de clusters ajudou ou dificultou a análise?
  6. A captura de tela do gráfico vai de -1 a 3. O que está sendo medido aqui? Ao contrário da educação e dos ganhos, altura e peso, qual é o número 3 no topo da escala nesse contexto?
  7. Na trama, a mensagem "Esses dois componentes explicam 50,96% da variabilidade de pontos" Eu já encontrei algumas informações detalhadas aqui (no caso de mais alguém se deparar com este post - apenas para entender o que os kmeans desejavam adicionar aqui).

Aqui estão alguns dos artigos que li que me ajudaram a criar esse script:


3
Se downvoting por favor deixe um comentário me deixar saber por que eu posso tentar alterar
— Doug Fir

Onde está kfitdisponível a documentação das funções? Eu olhei dentro da tmbiblioteca cran.r-project.org/web/packages/tm/tm.pdf e não encontrei kfitlá.
— ttnphns

Oi @ttnphns O kfit é uma variável do kfit <- kmeans (d, 2) no script de exemplo que criei. Não existe uma função real do kfit
— Doug Fir

O que eu fiz no SPSS com seus dados foi isso. Corri K-means com entradas (a) sua matriz de termos do documento tdm; (b) com sua matriz de distância euclidiana d. O K-means do SPSS trata a entrada sempre como casos X variáveis ​​dados e agrupa os casos. Como centros iniciais, insiro em ambas as análises os centros de saída de sua análise - cluster means. Resultados: na análise (b), mas não na (a), obtive centros finais idênticos aos centros de entrada. Isso significa que os meios K em (b) não puderam melhorar ainda mais os centros de cluster, o que implica que a análise (b) coincide com a análise k-médias feita por você.
— ttnphns

(cont.) Mas, como dito anteriormente, minha análise (b) tratou seus dados de entrada como matriz de dados, não como matriz de distância. Portanto, sua análise também o fez. Concluo que sua função K-means não foi projetada para receber matrizes de distância (ou você não conseguiu executar essa opção, se existir); é um K-significa padrão que requer matrizes de dados. É um erro tentar alimentá-lo com uma matriz de distância. Seus resultados de cluster foram, portanto, errôneos. Então foi a minha conclusão.
— ttnphns

Respostas:


5

Para entender como a kmeans()função funciona, você precisa ler a documentação e / ou inspecionar o código subjacente. Dito isto, tenho certeza de que não leva uma matriz de distância sem sequer se preocupar. Você pode escrever sua própria função para agrupar k-means a partir de uma matriz de distância, mas isso seria um aborrecimento terrível.

O algoritmo k-means deve operar sobre uma matriz de dados, não uma matriz de distância. Ele minimiza apenas as distâncias euclidianas quadradas (cf. Por que o algoritmo de agrupamento k-means usa apenas a métrica de distância euclidiana? ). Só é sensato quando você pode ter distâncias euclidianas como uma métrica de distância significativa. Esse sempre foi o caso desde que o algoritmo foi inventado, mas poucas pessoas parecem estar cientes disso, com o resultado de que o k-means é provavelmente o algoritmo mais mal utilizado no aprendizado de máquina.

A distância euclidiana não faz sentido para dados categóricos esparsos (mineração de texto), então eu nem tentaria algo assim. Primeiro, você precisa descobrir qual métrica de distância é apropriada para seus dados (@ttnphns explica algumas medidas possíveis aqui: Qual é a função de distância ideal para indivíduos quando os atributos são nominais? ). Em seguida, você pode calcular a matriz de distância e usar um algoritmo de agrupamento que pode operar sobre um (por exemplo, k-medianas / PAM, vários algoritmos hierárquicos etc.).


Obrigado @gung pela resposta bastante assertiva, era isso que eu procurava, pois estava um pouco incerta e desceu por uma toca de pesquisa na Internet que parecia me confundir ainda mais. Analisarei k-medianas e os outros algoritmos que você mencionou.
— Doug Fir

2
Além disso, parece que há uma lacuna no blogoshpere em torno disso, já que mais de um artigo usa a matriz de distância como uma entrada para kmeans, talvez um blogueiro copiei de outro e que teve um efeito em cascata em vários artigos desinformados.
— Doug Fir
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.