聚类分析(Cluster analysis)是一组将研究对象分为相对同质的群组(Clusters)的统计分析技术。 聚类分析区别于分类分析(Classification analysis) ,前者是无监督学习,而后者是有监督学习。 无监督学习也就是预先没有类别的标准,K-means方法是最常见的聚类方法之一,在R语言的kmeans()函数中,聚类数目的参数centers是必须人为输入的。那么究竟如何确定聚类的数目呢?这里引用一句话(参考文献1)"While there are no best solutions for the problem of determining the number of clusters to extract...",这里的潜台词是目前有很多方法,只是不知道选哪种。Anyway,大家知道有哪些方法吗? 下面通过一个实例对几种常见确定聚类数目的方法进行介绍。 数据 收集了96例患者的两个生化指标(a、b),研究者拟根据a、b两个指标将96例患者分类若干组,进而对不同的组深入分析,制定不同的治疗方案。a、b两个指标的关系如下图(下面是模拟数据,实际情况通常没有那么明显的距离)。那么,我们该聚多少类呢? set.seed(2018) n=100;g=6 mydata=data.frame(a=unlist(lapply(1:g,function(i) rnorm(n/g, runif(1)*i^2))), b=unlist(lapply(1:g,function(i) rnorm(n/g, runif(1)*i^2)))) mydata=scale(mydata) 1. 组内平方和 该方法是画出不同聚类数目(通常是1到10)对应的组内平方和,以组内平方和基本不再明显变化为标准(较为主观),从而确定聚类的数目。如下图,我们可以看到组内平方和在聚类数目为5之后,基本不再变化,所以可以确定聚类数目为5。 ss=(nrow(mydata)-1)*sum(apply(mydata,2,var)) for(i in 2:10){ss[i]=kmeans(mydata,centers=i)$tot.withinss} plot(1:10,ss,type="b",xlab="聚类数目",ylab="组内平方和") 2. Medoids周围分类法 这个方法的操作比较简单,顾名思义就是通过partitioning around medoids来估计最优的聚类数目。从下图的椭圆数目可以看出聚类数目应该为5。 library(fpc) library(cluster) fit=pamk(mydata) plot(pam(mydata,fit$nc)) 3. Calinsky准则 Calinsky是一个定量的评价指标,该值越大越好。下图的右边可以看出Calinsky较大值对应的聚类数目为5。 library(vegan) fit=cascadeKM(mydata,inf.gr=1,sup.gr=10,iter=1000) plot(fit,sortg=TRUE,grpmts.plot=TRUE) 4. BIC 没错,此处的BIC就是贝叶斯信息准则(Bayesian Information Criterion),但与其用于模型的拟合判断(越小越好)不同的是,这里用于判断聚类数目的判断标准为越大越好。如下图,右下角的图例表示各种不同的模型,从折线可以看出,所有的模型都在聚类数目为5时,BIC取得较大。 library(mclust) fit=Mclust(mydata) plot(fit) 5. AP法 AP表示Affinity propagation的意思,旨在通过Affinity propagation的方法估计最优的聚类数目。如下图,左侧和上侧的彩色带的颜色种类表示聚类的数目,为5。 library(apcluster) fit=apcluster(negDistMat(r=2),mydata) heatmap(fit) 6. 多目标决策 NbClust函数提供30种的判断指标,我们可以用类似投票的原理,看看通过30种指标选出的最优聚类数目。如下图,最后一句表示,聚类数目应该取3,这个结果与前述所有结果不一致,根据原始数据的情况,这个方法不太可靠,建议选择前述的方法。 library(NbClust) fit=NbClust(mydata,min.nc=2,max.nc=10,method="kmeans",index="alllong") 参考文献 https://www./advstats/cluster.html https:///questions/15376075/cluster-analysis-in-r-determine-the-optimal-number-of-clusters
|
|