使用大型数据集确定k-means的最佳聚类数

时间:2013-03-13 02:33:54

标签: r cluster-analysis k-means

我有一个62列和181408行的矩阵,我将使用k-means进行聚类。我理想的是一种识别最佳簇数的方法。我尝试使用群集包中的clusGap实现差异统计技术(下面的可重现代码),但这会产生几个与Windows中的向量大小(122 GB)和memory.limit问题相关的错误消息OS X中的“Error in dist(xs) : negative length vectors are not allowed”。是否有人对可用于确定具有大型数据集的最佳聚类数的技术有任何建议?或者,或者,如何使我的代码功能(并且不需要几天时间才能完成)?谢谢。

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

3 个答案:

答案 0 :(得分:1)

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

k-means执行最小SSQ分配,这在技术上等于最小化欧氏距离的平方。然而,已知欧几里德距离对于高维数据不适用。

答案 1 :(得分:1)

如果您不知道要作为k均值参数提供的簇k的数量,那么可以通过三种方法自动找到它:

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

  • x-means:一种新算法,可以有效地搜索聚类位置的空间和聚类数量,以优化贝叶斯信息准则(AIC)或贝叶斯信息准则(AIC)度量。此版本的k均值可以找到数字k,并且可以加速k均值。

  • 在线k均值或流式k均值:它允许通过扫描整个数据一次来执行k均值,并自动找到k的最佳数量。 Spark实现了它。

答案 2 :(得分: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.即   enter image description here

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

但是像Anony-Mouse所指出的那样,维度的诅咒会因为在k中使用欧氏距离而受到影响。
我希望这个答案能在一定程度上帮助你。