我想为我的数据集使用K-Means聚类。我在R中使用kmeans()函数来执行此操作。
k<-kmeans(data,centers=3)
plotcluster(m,k$cluster)
但是我不确定此功能的K值是否正确。我想尝试使用Elbow Method。 R中是否有任何包使用弯头方法执行聚类以找到最佳聚类数。
答案 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")
希望有所帮助