我正在寻找用于聚类分析的最佳聚类数。因此,我正在使用由以下代码创建的碎石图:
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))
答案 0 :(得分:2)
您可以找到连续值的第二个差异从正切换为负的值的索引。这将是二阶导数从正到负切换的离散等价物:
获得拐点值的索引(即,选择的值作为最佳簇数):
min(which(diff(diff(WSS)) < 0)) - 3
要获得WSS
的价值:
WSS[min(which(diff(diff(WSS)) < 0)) - 3]
- 3
是因为取第二个差异会将结果向量缩短2,然后再减去一个得到两个点中第一个的索引,第二个差值变为负值。
我不确定这是多么强大,如果有人没有提出更好的算法,我会感到惊讶,但也许这会让你开始。