Answers:
差异统计是完成此操作的好方法;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个簇)。
您也可以尝试使用更新的方法:A. Kalogeratos和A.Likas,浸入式均值:用于估计群集数量的增量群集方法,NIPS 2012。
想法是使用统计假设检验对包含集合中一个点与其余点之间的相似性/距离的向量进行单峰性检验。该测试使用Hartigan-Hartigan 浸入测试(Ann。统计员。13(1):70-84。
该方法以所有数据集作为一个聚类开始,并在拒绝单峰假设(即存在多个聚类)的情况下将其逐步拆分。
因此,该方法将指示数据中是否存在多个群集(您的问题),但它也可以提供最终的群集。
假设我正在考虑相同的示例,
库(集群)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)}; 打破; }
如何基于最大间隙统计信息来子集与最佳聚类解决方案相对应的聚类元素?这样我就可以将其用于每个群集的进一步分析。
我知道有一个称为子集的命令。给定所需的集群数量后,使用此命令没有问题。但是,当我们希望基于使用间隙获得的最优k进行子集化时,如何对其进行子集化(简而言之,如果存在循环,则对子集元素进行子集化)