r:从没有图形检查的scree图中检索最佳簇数

时间:2016-05-03 18:49:55

标签: r cluster-analysis k-means

我正在寻找用于聚类分析的最佳聚类数。因此,我正在使用由以下代码创建的碎石图:

WSS = sapply(1:20, FUN=function(k) {
  kmeans(df, centers=k, nstart=5)$tot.withinss
})
plot(1:20, WSS, type="l")
abline(v=5, col="red", lty=2)

现在,我知道图中的弯曲/拐点表示最佳簇数。有没有办法在没有图形检查的情况下检索这个值?

数据如下

df = structure(list(Birthrate = c(18.2, 8.5, 54.1, 1.4, 2.1, 83.6, 
17, 1, 0.8, 61.7, 4.9, 7.9, 2, 14.2, 48.2, 17.1, 10.4, 37.5, 
1.6, 49.5, 10.8, 6.2, 7.1, 7.8, 3, 3.7, 4.2, 8.7), GDP = c(1.22, 
0.06, 0, 0.54, 2.34, 0.74, 1.03, 1.21, 0, 0.2, 1.41, 0.79, 2.75, 
0.03, 11.13, 0.05, 2.99, 0.71, 0, 0.9, 1.15, 0, 1.15, 1.44, 0, 
0.71, 1.21, 1.45), Income = c(11.56, 146.75, 167.23, 7, 7, 7, 
10.07, 7, 7, 7, 47.43, 20.42, 7.52, 7, 7, 15.98, 15.15, 20.42, 
7, 22.6, 7, 7, 18.55, 7, 7.7, 7, 7, 7), Population = c(54, 94, 
37, 95, 98, 31, 78, 97, 95, 74, 74, 81, 95, 16, 44, 63, 95, 20, 
95, 83, 98, 98, 84, 62, 98, 98, 97, 98)), .Names = c("Birthrate", 
"GDP", "Income", "Population"), class = "data.frame", row.names = c(NA, 
-28L))

1 个答案:

答案 0 :(得分:2)

您可以找到连续值的第二个差异从正切换为负的值的索引。这将是二阶导数从正到负切换的离散等价物:

获得拐点值的索引(即,选择的值作为最佳簇数):

min(which(diff(diff(WSS)) < 0)) - 3 

要获得WSS的价值:

WSS[min(which(diff(diff(WSS)) < 0)) - 3]

- 3是因为取第二个差异会将结果向量缩短2,然后再减去一个得到两个点中第一个的索引,第二个差值变为负值。

我不确定这是多么强大,如果有人没有提出更好的算法,我会感到惊讶,但也许这会让你开始。

相关问题