k-means聚类 - 为什么所有相​​同的聚类?

时间:2014-04-20 14:58:50

标签: r k-means

我正在使用10842条推文上的一组文本数据运行k-means聚类。我将k设置为5,然后按照下面的方式获得了我的簇

cluster1:预订航班NA

cluster2:航班预订NA

cluster3:航班预订NA

cluster4:航班预订NA

cluster5:预订航班NA

我不明白为什么所有群集都相同?

myCorpus<-Corpus(VectorSource(myCorpus$text))
myCorpusCopy<-myCorpus
myCorpus<-tm_map(myCorpus,stemDocument)
myCorpus<-tm_map(myCorpus,stemCompletion,dictionary=myCorpusCopy)
myTdm<-TermDocumentMatrix(myCorpus,control=list(wordLengths=c(1,Inf)))
myTdm2<-removeSparseTerms(myTdm,sparse=0.95)
m2<-as.matrix(myTdm2)
m3<-t(m2)
set.seed(122)
k<-5
kmeansResult<-kmeans(m3,k)
round(kmeansResult$centers,digits=3)

for(i in 1:k){
cat(paste("cluster",i,":",sep=""))
s<-sort(kmeansResult$centers[i,],decreasing=T)
cat(names(s)[1:3],"\n")
}

1 个答案:

答案 0 :(得分:0)

请记住,k-means聚类需要您预先指定聚类数(与层次聚类相反)。如果无法访问您的数据集(因此无法重现您在此处所呈现的内容),那么您获得看似均匀的群集的最明显原因是您预先指定的群集数量存在问题。

最直接的解决方案是尝试R中的NbClust包来确定适合您数据的群集数量。

以下是使用玩具数据集的示例代码,以便您了解如何继续:

# install.packages("NbClust")
library(NbClust)
set.seed(1234)
df <- rbind(matrix(rnorm(100,sd=0.1),ncol=2),
     matrix(rnorm(100,mean=1,sd=0.2),ncol=2),
     matrix(rnorm(100,mean=5,sd=0.1),ncol=2),
     matrix(rnorm(100,mean=7,sd=0.2),ncol=2))

# "scree" plots on appropriate number of clusters (you should look
# for a bend in the graph)
nc <- NbClust(df, min.nc=2, max.nc=20, method="kmeans") 
table(nc$Best.n[1,]) 

# creating a bar chart to visualize results on appropriate number
# of clusters
barplot(table(nc$Best.n[1,]), 
      xlab="Number of Clusters", ylab="Number of Criteria",
      main="Number of Clusters Chosen by Criteria")

如果在指定群集数量后仍然遇到问题 由NbClust包中的函数建议,然后是另一个问题 可能会删除稀疏的术语。尝试调整“稀疏” 选项向下,然后检查k-means聚类的输出。