3

在我的方法中,我试图找到“k”的最佳值,以使用 KMEANS 算法对一组文档进行聚类。我想使用“AIC”和“BIC”信息标准函数来寻找最佳模型。我使用此资源“sherrytowers.com/2013/10/24/k-means-clustering/”来找到“k”的最佳值。

但是当我运行代码时,我得到了 AIC 和 BIC 的以下图表。我无法从图表中解释任何内容。我的疑问是

  1. 我的方法是否错误并且这些度量(AIC,BIC)不能用于使用 Kmeans 进行文档聚类?
  2. 或者编程逻辑有错误,“AIC”和“BIC”是找到“k”簇数的正确方法?

这是我的代码

library(tm)
library(SnowballC)
corp <- Corpus(DirSource("/home/dataset/"), readerControl = list(blank.lines.skip=TRUE));  ## forming Corpus from document set 
corp <- tm_map(corp, stemDocument, language="english")
dtm <- DocumentTermMatrix(corp,control=list(minwordlength = 1)) ## forming Document Term Matrix
dtm_tfidf <- weightTfIdf(dtm)
m <- as.matrix(dtm_tfidf)
norm_eucl <- function(m) m/apply(m, MARGIN=1, FUN=function(x) sum(x^2)^.5)
m_norm <- norm_eucl(m)

kmax = 50

totwss = rep(0,kmax) # will be filled with total sum of within group sum squares
kmfit = list() # create and empty list
for (i in 1:kmax){
  kclus = kmeans(m_norm,centers=i,iter.max=20)
  totwss[i] = kclus$tot.withinss
  kmfit[[i]] = kclus
}

kmeansAIC = function(fit){

  m = ncol(fit$centers)
  n = length(fit$cluster)
  k = nrow(fit$centers)
  D = fit$tot.withinss
  return(D + 2*m*k)
}
aic=sapply(kmfit,kmeansAIC)
plot(seq(1,kmax),aic,xlab="Number of clusters",ylab="AIC",pch=20,cex=2)


kmeansBIC = function(fit){

  m = ncol(fit$centers)
  n = length(fit$cluster)
  k = nrow(fit$centers)
  D = fit$tot.withinss
  return(D + log(n)*m*k)
}
bic=sapply(kmfit,kmeansBIC)
plot(seq(1,kmax),bic,xlab="Number of clusters",ylab="BIC",pch=20,cex=2)

这些是它生成的图表 http://snag.gy/oAfhk.jpg http://snag.gy/vT8fZ.jpg

4

0 回答 0