2

我有一个 62 列和 181408 行的矩阵,我将使用 k-means 进行聚类。理想情况下,我想要一种确定最佳集群数量的方法。我已经尝试使用clusGapcluster 包(下面的可重现代码)实现间隙统计技术,但这会产生一些与向量大小(122 GB)和memory.limitWindows 中的问题以及Error in dist(xs) : negative length vectors are not allowedOS X 中的“”有关的错误消息。有谁对确定具有大型数据集的最佳集群数量的技术有什么建议吗?或者,或者,如何使我的代码起作用(并且不需要几天才能完成)?谢谢。

library(cluster)
inputdata<-matrix(rexp(11247296, rate=.1), ncol=62)
clustergap <- clusGap(inputdata, FUN=kmeans, K.max=12, B=10)
4

3 回答 3

2

在 62 维时,由于维度的诅咒,结果可能毫无意义。

k-means 进行最小 SSQ 分配,这在技术上等于最小化平方欧几里德距离。然而,众所周知,欧几里得距离不适用于高维数据。

于 2013-03-13T10:13:37.433 回答
2

如果您不知道要作为参数提供给 k-means 的集群 k 的数量,那么有三种方法可以自动找到它:

  • G-means 算法:它使用统计测试自动发现簇的数量,以决定是否将 k-means 中心一分为二。该算法采用分层方法来检测集群的数量,基于对数据子集遵循高斯分布(近似于事件的精确二项式分布的连续函数)的假设的统计检验,如果不是,则拆分集群. 它从少量中心开始,比如只有一个集群 (k=1),然后算法将其拆分为两个中心 (k=2) 并再次拆分这两个中心中的每一个 (k=4),其中有四个中心全部的。如果 G-means 不接受这四个中心,那么答案是上一步:在这种情况下是两个中心 (k=2)。这是您的数据集将分成的集群数量。当您无法估计分组实例后将获得的集群数量时,G-means 非常有用。请注意,“k”参数的不便选择可能会给您错误的结果。g-means 的并行版本称为p 表示。G-means 来源: 来源 1 来源 2 来源 3

  • x-means:一种新算法,可以有效地搜索集群位置和集群数量的空间,以优化贝叶斯信息准则 (BIC) 或 Akaike 信息准则 (AIC) 度量。这个版本的 k-means 找到数字 k 并且还加速了 k-means。

  • Online k-means 或 Streaming k-means:它允许通过扫描整个数据一次来执行 k-means,并自动找到最佳 k 数。Spark 实现了它。

于 2019-02-05T11:30:26.947 回答
0

这是来自 RBloggers。 https://www.r-bloggers.com/k-means-clustering-from-r-in-action/

您可以执行以下操作:

data(wine, package="rattle")
head(wine)
df <- scale(wine[-1])
wssplot <- function(data, nc=15, seed=1234){
           wss <- (nrow(data)-1)*sum(apply(data,2,var))
           for (i in 2:nc){
                set.seed(seed)
                wss[i] <- sum(kmeans(data, centers=i)$withinss)}
            plot(1:nc, wss, type="b", xlab="Number of Clusters",
                 ylab="Within groups sum of squares")}

 wssplot(df)  

这将创建一个这样的情节。
从中您可以选择 k 的值是 3 或 4。即
在此处输入图像描述

当从 1 个集群移动到 3 个集群时,“组内平方和”明显下降。在三个集群之后,这种下降会下降,这表明 3 集群解决方案可能非常适合数据。

但就像 Anony-Mouse 指出的那样,维度诅咒的影响是因为 k 中使用了欧几里得距离意味着。
我希望这个答案能在一定程度上帮助你。

于 2016-11-18T04:41:13.913 回答