【问题标题】:Knee point estimation via R code for Kmeans clustering通过 R 代码进行 Kmeans 聚类的拐点估计
【发布时间】:2016-04-04 17:34:21
【问题描述】:

我有以下代码,我可以使用它绘制 WSS 曲线来定位膝盖,以便我可以为 KMeans 聚类选择 K 的值。

# To find WSS 
findWSS <- function(data) {
if (VERBOSE) {
    print(paste("[TRACER] Finding WSS.."))
}
start <- Sys.time()
wss <- (nrow(data)-1)*sum(apply(data,2,var))

for (i in 2:length(unique(data))) {
    wss[i] <- sum(kmeans(data, centers=i)$withinss)
}
if (ENABLE_PLOTS) {
    plot(1:length(unique(data)), wss, type="b", xlab="Number of Clusters", ylab="Within groups sum of squares")
}
end <- Sys.time()
if (ENABLE_MEASUREMENTS && VERBOSE) {
    print(paste("[TIMER] Finding WSS:", difftime(end, start), "secs"))
}
}

以下是我得到的情节的表示:

例如,上图中观察到的膝盖是 3。但我想在 R

中以编程方式计算这个膝盖

对我如何做同样的事情有什么想法吗?

【问题讨论】:

  • 您对“观察到的膝盖”的统计标准是什么?当我使用由 2 组构造的 100x2 矩阵(?kmeans 中的示例)执行此操作时,没有明确的拐点,曲线上的点与原点的距离最小,这可能是“拐点”的一种定义建议有 6-9 组。
  • 您可以尝试通过Hastie et al 实现差距统计。请参阅此处了解已工作的example
  • 谢谢。我使用图书馆“集群”中的 clusGap 来进行差距统计
  • 在我看来,膝盖是 2... 你可能会注意到我们不同意,那么算法如何找到“正确”的解决方案?不要信任/依赖这些统计数据,而是可视化您的数据并仔细检查集群。

标签: r cluster-analysis k-means


【解决方案1】:

我做过的事情(不那么严格,但可能更直观)是获取 WSS 差异之间的差异(即图中点之间的 y 差异)并聚类它们 em>,分成 2 组。这是基于大变化有意义而小的变化没有意义的想法,并试图区分这些“大”和“小”集群。

然后我根据“小”组中的第一个差异选择组数,即如果“差异(k=3,k=4)”值是第一个“小”值,那么正确的数字of clusters 为 3,因为当添加超过 3 个集群时,找不到更有意义的结构。

如果集群是分层的(因为它会很快停止),这将错过更细粒度的结构,但我发现它是一个不错的起点。

【讨论】:

    【解决方案2】:

    我使用了“cluster”库中的 clusGap 来帮助解决这个问题。这是我用来解决这个问题的代码,供任何想参考它的人使用:

    # Compute Gap statistic (http://web.stanford.edu/~hastie/Papers/gap.pdf) to identify number of clusters
    # Note: This method is slow due to bootstrapping
    computeGapStatistic <- function(data, KMax) {
    # gap <- clusGap((data), FUN = kmeans, K.max = 8, B = 3) 
    gap <- clusGap((data), FUN = kmeans, K.max = KMax, B = 3) 
    if (ENABLE_PLOTS) {
        plot(gap, main = "Gap statistic for the Nursing shift data")
    }
    clusterCount <- with(gap,maxSE(Tab[,"gap"],Tab[,"SE.sim"]))
    if (VERBOSE) {
        print(paste("gap statsitics: ", gap[[1]]))
        print(paste("K: ", clusterCount))
    }
    return(clusterCount)
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 2017-06-08
      • 2021-06-10
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多