分析(Classification analysis) ,前者是无监督学习,而后者是有监督学习。
聚类分析(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.statmethods.net/advstats/cluster.html
https://stackoverflow.com/questions/15376075/cluster-analysis-in-r-determine-the-optimal-number-of-clusters