6

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

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

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

4

5 回答 5

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,计算机科学讲义,卷。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

另请参阅寻找曲线上的最佳权衡点,以获得对一般方法的精彩讨论。

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

于 2013-08-04T20:38:27.747 回答
3

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

所以另一种选择是使用剪影方法来找到它。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")

希望能帮助到你!!

于 2013-08-05T06:39:23.440 回答
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

于 2013-08-04T12:16:12.400 回答
2

我的经验是你不能自动化这个——你需要制作情节并检查肘部。这里有一些很好的例子:R中的聚类分析:确定最佳聚类数

于 2013-08-04T13:56:36.667 回答
0

我尝试了 GMD 包。由于某种原因,这花费了很多时间,并且在此步骤中返回错误肘部错误(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")

希望有帮助

于 2014-05-14T16:15:29.257 回答