实施肘部方法以找到 R 中 K-Means 聚类的最佳聚类数 [关闭]

Posted

技术标签:

【中文标题】实施肘部方法以找到 R 中 K-Means 聚类的最佳聚类数 [关闭]【英文标题】:Implementing the Elbow Method for finding the optimum number of clusters for K-Means Clustering in R [closed] 【发布时间】:2013-08-05 05:21:27 【问题描述】:

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

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

但是我不确定这个函数的正确 K 值是多少。我想尝试为此使用Elbow Method。 R中是否有任何包使用肘部方法执行聚类以找到最佳聚类数。

【问题讨论】:

来自***的文章:“这个“肘部”不能总是被明确地识别出来。”我认为这种方法存在一定的主观性,这使得实现变得困难。 Cluster analysis in R: determine the optimal number of clusters的可能重复 【参考方案1】:

这里混淆了两个问题。一个是如何找到曲线上的变化点,另一个是关于在使用 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,计算机科学讲义,卷。 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,了解有关一般方法的精彩讨论。

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

【讨论】:

【参考方案2】:

是的,您可以使用 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")

希望对你有帮助!

【讨论】:

一些结果插图和对思维过程的更多解释将使这个全面的答案变成一个很好的答案!【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我的经验是,您无法自动执行此操作——您需要制作情节并检查肘部。这里有一些很好的例子:Cluster analysis in R: determine the optimal number of clusters

【讨论】:

我试过这样做..但我得到的图表与***文章中的图表非常不同......很难从中找出肘点 您可以自动化任何事情 - 问题是自动化找到拐点的可靠性 :) 你好。如果肘部在图中不明显,那么这实际上表明对于集群的数量 k 没有一个“正确”的答案。您可以尝试其他指标(AIC/BIC)或其他聚类方法。然而,底线可能是您需要一种非统计方法来选择 k(例如主题专业知识)。 (附注:如果您可以分享图表,请继续发布!)【参考方案5】:

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

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

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")

希望对你有帮助

【讨论】:

以上是关于实施肘部方法以找到 R 中 K-Means 聚类的最佳聚类数 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

K-means算法原理与R语言实例

K均值聚类算法

⭐K-Means和DBSCAN聚类算法——理论结合代码的实现

⭐K-Means和DBSCAN聚类算法——理论结合代码的实现

R语言KMeans聚类分析确定最优聚类簇数实战:肘部法则elbow method(确定最优聚类簇数)

K-means 聚类的质心