为k均值选择聚类:1个聚类情况


9

有谁知道一种确定使用kmeans进行聚类是否合适的好方法?也就是说,如果您的样品实际上是同质的,该怎么办?我知道类似混合模型(通过R中的mclust)可以为1:k群集情况提供适合的统计信息,但是似乎所有评估kmeans的技术都至少需要2个群集。

有谁知道一种比较kmeans的1和2集群案例的技术?

Answers:


10

差异统计是完成此操作的好方法;Tibshirani,Hastie&Walther(2001)。

http://stat.ethz.ch/R-manual/R-devel/library/cluster/html/clusGap.html-相关的R包。

这个想法是,它针对K = 1,2,3,...进行数据聚类的顺序假设检验,而随机噪声的零假设则等于一个聚类。它的特殊优势在于,它可以可靠地指示K = 1,即是否不存在聚类。

这是一个例子,几天前我正在检查一些天文学数据-即来自正在运行的系外行星调查。我想知道关于(凸)簇的证据是什么。我的数据是“过境”

library(cluster)
cgap <- clusGap(transit, FUN=kmeans, K.max=kmax, B=100)
for(k in 1:(kmax-1)) {
    if(cgap$Tab[k,3]>cgap$Tab[(k+1),3]-cgap$Tab[(k+1),4]) {print(k)}; 
    break;
}

使用间隙统计量,您正在寻找测试“失败”的K的第一个值,即间隙统计量显着下降。上面的循环将打印出这样的ak,但是简单地绘制cgap可以得到下图:
在此处输入图片说明 查看间隙从k = 1到k = 2的显着下降,这表明实际上没有簇(即1个簇)。


对于具有单个链接的层次聚类,该如何做?您能解释一下clusGap的FUN论点吗?我为分层kmax = 20 cgap <-clusGap(cluster_feat_base [,2:ncol(cluster_feat_base)],FUN = hclust,K.max = kmax,B = 100)运行了以下代码行。但是它给出了一个错误,指出FUNcluster(X,kk,...)中的错误:无效的群集方法2
GeorgeOfTheRF

4

您也可以尝试使用更新的方法:A. Kalogeratos和A.Likas,浸入式均值:用于估计群集数量的增量群集方法,NIPS 2012。

想法是使用统计假设检验对包含集合中一个点与其余点之间的相似性/距离的向量进行单峰性检验。该测试使用Hartigan-Hartigan 浸入测试(Ann。统计员。13(1):70-84。

该方法以所有数据集作为一个聚类开始,并在拒绝单峰假设(即存在多个聚类)的情况下将其逐步拆分。

因此,该方法将指示数据中是否存在多个群集(您的问题),但它也可以提供最终的群集。

在这里,您可以在Matlab中找到一些代码


0

假设我正在考虑相同的示例,

库(集群)cgap <-clusGap(transit,FUN = kmeans,K.max = kmax,B = 100)for(k in 1:(kmax-1)){if(cgap Tab [(k + 1),3] -cgap $ Tab [(k + 1),4]){print(k)}; 打破; }Tab[k,3]>cgap

如何基于最大间隙统计信息来子集与最佳聚类解决方案相对应的聚类元素?这样我就可以将其用于每个群集的进一步分析。

我知道有一个称为子集的命令。给定所需的集群数量后,使用此命令没有问题。但是,当我们希望基于使用间隙获得的最优k进行子集化时,如何对其进行子集化(简而言之,如果存在循环,则对子集元素进行子集化)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.