分享

究竟应该聚多少类?聚类分析

 车厘子V 2018-08-06
聚类分析(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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多