为什么 k-means 的差距统计表明一个集群,即使它们显然有两个?

机器算法验证 r 机器学习 聚类 k-均值
2022-02-15 01:07:10

我正在使用 K-means 对我的数据进行聚类,并正在寻找一种建议“最佳”聚类数的方法。间隙统计似乎是找到一个好的簇数的常用方法。

出于某种原因,它返回 1 作为最佳簇数,但是当我查看数据时,很明显有 2 个簇:

![1](http://i60.tinypic.com/28bdy6u.jpg)

这就是我在 R 中调用间隙的方式:

gap <- clusGap(data, FUN=kmeans, K.max=10, B=500)
with(gap, maxSE(Tab[,"gap"], Tab[,"SE.sim"], method="firstSEmax"))

结果集:

> Number of clusters (method 'firstSEmax', SE.factor=1): 1
          logW   E.logW           gap    SE.sim
[1,]  5.185578 5.085414 -0.1001632148 0.1102734
[2,]  4.438812 4.342562 -0.0962498606 0.1141643
[3,]  3.924028 3.884438 -0.0395891064 0.1231152
[4,]  3.564816 3.563931 -0.0008853886 0.1387907
[5,]  3.356504 3.327964 -0.0285393917 0.1486991
[6,]  3.245393 3.119016 -0.1263766015 0.1544081
[7,]  3.015978 2.914607 -0.1013708665 0.1815997
[8,]  2.812211 2.734495 -0.0777154881 0.1741944
[9,]  2.672545 2.561590 -0.1109558011 0.1775476
[10,] 2.656857 2.403220 -0.2536369287 0.1945162

我做错了什么还是有人知道更好的方法来获得一个好的集群号?

3个回答

除其他外,聚类取决于规模。有关此问题的讨论,请参阅(除其他外您应该何时集中和标准化数据?PCA 关于协方差或相关性?.

这是以 1:1 的纵横比绘制的数据,显示了两个变量的比例有多大不同:

图1

在其右侧,gap stats 图显示了按簇数 ( ) 统计的统计数据,其中标准误差用垂直线段绘制,的最佳值用垂直蓝色虚线标记。根据帮助,kkclusGap

默认方法“firstSEmax”查找最小的,使其值与第一个局部最大值的距离不超过 1 个标准误差。kf(k)

其他方法的行为类似。此标准不会导致任何差距统计数据脱颖而出,从而导致估计k=1

尺度的选择取决于应用程序,但合理的默认起点是数据离散度的度量,例如 MAD 或标准差。该图在重新归零并重新缩放后重复分析,为每个分量生成单位标准偏差:ab

图 2

K-means 解决方案由左侧数据散点图中的不同符号类型和颜色表示在集合中,在右边的间隙统计图中明显受到青睐:它是第一个局部最大值和较小的统计数据(即 ) 显着降低。对于这么小的数据集,较大的值可能会过拟合,并且没有一个明显优于此处显示它们只是为了说明一般方法。 k=2k{1,2,3,4,5}k=2kk=1kk=2


这是R生成这些数字的代码。数据与问题中显示的数据大致匹配。

library(cluster)
xy <- matrix(c(29,391, 31,402, 31,380, 32.5,391, 32.5,360, 33,382, 33,371,
        34,405, 34,400, 34.5,404, 36,343, 36,320, 36,303, 37,344,
        38,358, 38,356, 38,351, 39,318, 40,322, 40, 341), ncol=2, byrow=TRUE)
colnames(xy) <- c("a", "b")
title <- "Raw data"
par(mfrow=c(1,2))
for (i in 1:2) {
  #
  # Estimate optimal cluster count and perform K-means with it.
  #
  gap <- clusGap(xy, kmeans, K.max=10, B=500)
  k <- maxSE(gap$Tab[, "gap"], gap$Tab[, "SE.sim"], method="Tibs2001SEmax")
  fit <- kmeans(xy, k)
  #
  # Plot the results.
  #
  pch <- ifelse(fit$cluster==1,24,16); col <- ifelse(fit$cluster==1,"Red", "Black")
  plot(xy, asp=1, main=title, pch=pch, col=col)
  plot(gap, main=paste("Gap stats,", title))
  abline(v=k, lty=3, lwd=2, col="Blue")
  #
  # Prepare for the next step.
  #
  xy <- apply(xy, 2, scale)
  title <- "Standardized data"
}

我认为您在使用 GAP 统计数据时没有理解任何错误。我相信尽管您被可视化中的数据规模部分误导了。您会看到两个集群,但实际上与x方向相比,方向相当小y基于此,您会期望两个延长的集群。然而,看起来你的一种变异模式支配了另一种。由于 GAP 统计假设一个具有单个组件 ( ) 的空模型,然后尝试拒绝该模型以使用的替代模型;您观察到的是无法拒绝空值。请注意,无法拒绝零假设并不能使它成为真的K=1K>1. 如果您想更多地查看技术细节,可以在线获取描述 GAP 统计数据的方法论文件。

我使用高斯混合模型(GMM -均值的泛化,有关此问题的更多信息,请参阅此线程)运行您的模型。在这种情况下,GAP 统计数据也确实表明了单个集群。BIC 还建议使用单一集群。AIC 建议 4 个集群(!),这是我们开始过度拟合的明显迹象。使用的样本不是很大;您有 21 个点,其中一种方差模式优于另一种。拥有两个只有 21 个二维点的二维聚类(即,拟合两个二维均值和两个:) (在的情况下,意味着您的协方差矩阵更加结构化(您不查看协方差),但我不会在这里关注这个问题。)k2×2k

编辑:为了完整起见:@whuber 表明,如果一个集群标准化了他的数据,如果对数据进行标准化,则应用于 GMM 拟合的 GAP 标准也会将作为最佳聚类数。kK=2

我和原始海报有同样的问题。R 文档目前说 d.power = 1 的原始和默认设置不正确,应替换为 d.power:“默认值 d.power = 1 对应于“历史”R 实现,而 d.power = 2 对应于 Tibshirani 等人提出的建议。这是由 Juan Gonzalez 在 2016 年 2 月发现的。

因此,更改 d.power = 2 为我解决了这个问题。

https://www.rdocumentation.org/packages/cluster/versions/2.0.6/topics/clusGap