实现弯头方法寻找R中K-Means聚类的最优簇数

时间:2013-08-04 11:11:50

标签: r k-means

我想为我的数据集使用K-Means聚类。我在R中使用kmeans()函数来执行此操作。

 k<-kmeans(data,centers=3)
 plotcluster(m,k$cluster)

但是我不确定此功能的K值是否正确。我想尝试使用Elbow Method。 R中是否有任何包使用弯头方法执行聚类以找到最佳聚类数。

5 个答案:

答案 0 :(得分:8)

这里有两个问题混在一起。一个是如何在曲线上找到变化点,另一个是如何在使用k-means对数据进行分类时量化拟合质量。但是,聚类分析人员似乎将这两个问题混为一谈。不要害怕使用适合您的情况的任何拟合度量来研究其他曲线拟合/变化点方法。

我知道你所链接的'肘'方法是一种特定的方法,但你可能会对贝叶斯信息准则(BIC)中寻找“膝盖”的类似东西感兴趣。考虑到更复杂解决方案的额外计算要求,BIC中的扭结与聚类数量(k)是可以证明通过添加更多聚类来增加BIC不再有益的点。有一种很好的方法可以从BIC二阶导数的符号变化中检测出最小数量的聚类。参见例如

Zhao,Q.,V。Hautamaki和P. Franti 2008a:BIC中的拐点检测用于检测簇的数量。智能视觉系统的高级概念,J.Blanc-Talon,S.Bourennane,W.Philips,D.Popescu,和P. Scheunders,Eds。,Springer Berlin / Heidelberg,Lecture Notes in Computer Science,Vol。 5259,664-673,doi:10.1007 / 978-3-540-88458-3 60。

Zhao,Q.,M。Xu和P. Franti,2008b:贝叶斯信息准则的拐点检测。具有人工智能的工具,2008年.ICTAI '08。第20届IEEE国际会议,第二卷。 2,431-438,doi:10.1109 / ICTAI.2008.154

您可能对http://journals.ametsoc.org/doi/abs/10.1175/JAMC-D-11-0227.1

中报告的天气数据的自动应用感兴趣

另见Finding the best trade-off point on a curve对一般方法的精彩讨论。

最后一点观察:确保你的对数一致。不同的社区使用不同的符号,这可能是比较结果时的错误来源。

答案 1 :(得分:3)

是的,您可以使用Elbow方法找到最佳数量的聚类,但我发现使用脚本从肘图中找到聚类的值很麻烦。你可以观察肘图并亲自找到肘部点,但是从脚本中找到它是很多工作。

另一个选择是使用Silhouette Method来查找它。 Silhouette的结果完全符合Elbow方法的结果。

这就是我所做的。

#Dataset for Clustering
n = 150
g = 6 
set.seed(g)
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), 
                y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))))
mydata<-d
#Plot 3X2 plots
attach(mtcars)
par(mfrow=c(3,2))

#Plot the original dataset
plot(mydata$x,mydata$y,main="Original Dataset")

#Scree plot to deterine the number of clusters
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
  for (i in 2:15) {
    wss[i] <- sum(kmeans(mydata,centers=i)$withinss)
}   
plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="Within groups sum of squares")

# Ward Hierarchical Clustering
d <- dist(mydata, method = "euclidean") # distance matrix
fit <- hclust(d, method="ward") 
plot(fit) # display dendogram
groups <- cutree(fit, k=5) # cut tree into 5 clusters
# draw dendogram with red borders around the 5 clusters 
rect.hclust(fit, k=5, border="red")

#Silhouette analysis for determining the number of clusters
library(fpc)
asw <- numeric(20)
for (k in 2:20)
  asw[[k]] <- pam(mydata, k) $ silinfo $ avg.width
k.best <- which.max(asw)

cat("silhouette-optimal number of clusters:", k.best, "\n")
plot(pam(d, k.best))

# K-Means Cluster Analysis
fit <- kmeans(mydata,k.best)
mydata 
# get cluster means 
aggregate(mydata,by=list(fit$cluster),FUN=mean)
# append cluster assignment
mydata <- data.frame(mydata, clusterid=fit$cluster)
plot(mydata$x,mydata$y, col = fit$cluster, main="K-means Clustering results")

希望它有所帮助!!

答案 2 :(得分:2)

GMD包提供了用于聚类评估的Elbow方法,请参阅:(第7页) http://cran.r-project.org/web/packages/GMD/GMD.pdf

一个很好的例子见: http://www.inside-r.org/packages/cran/GMD/docs/elbow

HTH

答案 3 :(得分:2)

我的经验是你不能自动化 - 你需要制作情节并检查肘部。以下是一些很好的例子:Cluster analysis in R: determine the optimal number of clusters

答案 4 :(得分:0)

我尝试了GMD包。由于某种原因,它花了很多时间,并在此步骤中返回错误 elbow.batch(css.obj)中的错误: 一个好k' is not available with provided inc.thres and ev.thres; please make adjustment, e.g. decrease ev.thres',增加inc.thres' or increase k'。

所以这是我获得最佳K的解决方案(它在54列数据集(所有整数)上运行6000+行

mydata <- read.csv(file.choose(), header = TRUE)
mydata_scaled <- as.data.frame(lapply(mydata, scale))
mss <- (nrow(mydata_scaled)-1)*sum(apply(mydata_scaled,2,var))
for (i in 2:15) mss[i] <- sum(kmeans(mydata_scaled,centers=i)$withinss)
plot(1:15, mss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares")

希望有所帮助