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

大数据 数据分析
聚类分析(Cluster analysis)是一组将研究对象分为相对同质的群组(Clusters)的统计分析技术。 聚类分析区别于分类分析(Classification analysis) ,前者是无监督学习,而后者是有监督学习。本文通过一个实例对几种常见确定聚类数目的方法进行介绍。

分析(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两个指标的关系如下图(下面是模拟数据,实际情况通常没有那么明显的距离)。那么,我们该聚多少类呢?

 

  1. set.seed(2018)  
  2. n=100;g=6  
  3. 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)))) 
  4. mydata=scale(mydata) 

 

1. 组内平方和

该方法是画出不同聚类数目(通常是1到10)对应的组内平方和,以组内平方和基本不再明显变化为标准(较为主观),从而确定聚类的数目。如下图,我们可以看到组内平方和在聚类数目为5之后,基本不再变化,所以可以确定聚类数目为5。

 

  1. ss=(nrow(mydata)-1)*sum(apply(mydata,2,var))  
  2. for(i in 2:10){ss[i]=kmeans(mydata,centers=i)$tot.withinss}  
  3. plot(1:10,ss,type="b",xlab="聚类数目",ylab="组内平方和"

 

2. Medoids周围分类法

这个方法的操作比较简单,顾名思义就是通过partitioning around medoids来估计最优的聚类数目。从下图的椭圆数目可以看出聚类数目应该为5。

 

  1. library(fpc)  
  2. library(cluster)  
  3. fit=pamk(mydata)  
  4. plot(pam(mydata,fit$nc)) 

 

3. Calinsky准则

Calinsky是一个定量的评价指标,该值越大越好。下图的右边可以看出Calinsky较大值对应的聚类数目为5。

 

  1. library(vegan)  
  2. fit=cascadeKM(mydata,inf.gr=1,sup.gr=10,iter=1000)  
  3. plot(fit,sortg=TRUE,grpmts.plot=TRUE

 

4. BIC

没错,此处的BIC就是贝叶斯信息准则(Bayesian Information Criterion),但与其用于模型的拟合判断(越小越好)不同的是,这里用于判断聚类数目的判断标准为越大越好。如下图,右下角的图例表示各种不同的模型,从折线可以看出,所有的模型都在聚类数目为5时,BIC取得较大。

 

  1. library(mclust)  
  2. fit=Mclust(mydata)  
  3. plot(fit) 

 

5. AP法

AP表示Affinity propagation的意思,旨在通过Affinity propagation的方法估计最优的聚类数目。如下图,左侧和上侧的彩色带的颜色种类表示聚类的数目,为5。

 

  1. library(apcluster)  
  2. fit=apcluster(negDistMat(r=2),mydata)  
  3. heatmap(fit) 

 

6. 多目标决策

NbClust函数提供30种的判断指标,我们可以用类似投票的原理,看看通过30种指标选出的最优聚类数目。如下图,最后一句表示,聚类数目应该取3,这个结果与前述所有结果不一致,根据原始数据的情况,这个方法不太可靠,建议选择前述的方法。

 

  1. library(NbClust)  
  2. 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

责任编辑:未丽燕 来源: 网络大数据
相关推荐

2020-07-23 09:15:25

Python机器学习聚类分析

2015-08-19 10:13:53

DaasVDI

2023-05-10 08:00:00

聚类分析数据分析聚类算法

2011-08-25 12:51:02

2018-06-06 14:17:44

聚类分析算法大数据

2016-05-06 08:08:29

2009-10-26 09:26:42

Windows7多核评Windows 7多核

2021-10-18 11:55:10

SMTCPU线程

2020-03-12 09:06:05

数据挖掘聚类分析学习

2017-07-10 16:23:29

线程CPU单核

2023-10-31 09:00:00

2020-05-13 15:57:59

聚类分析算法监督学习

2014-07-29 15:20:15

2017-05-15 11:10:10

大数据聚类算法

2020-07-09 15:26:18

Python聚类算法语言

2018-10-18 09:41:41

2021-10-10 18:29:27

URL编码Go

2015-12-18 10:51:52

2012-06-14 09:46:55

数据分析

2014-07-02 10:34:08

聚类算法算法
点赞
收藏

51CTO技术栈公众号