简介
聚类分析用于识别并集中多元数据中相似的对象,观测值(或个体)之间的相似性是通过一些距离度量来定义的,包括欧几里得距离度量和基于相关关系的距离度量。聚类方法分为以k-means为代表的分区聚类(Partitioning clustering)和层次聚类两种。
用途
将目标划分为相似群体
寻找离群的异常表现个体
将大量高纬度数据简单化
总的来说,聚类在利用较少的分组来代表各种不同的数据中具有非常好的作用。它产生了有意义和可操作的数据结构,减少了数据复杂性,并为数据关系模式的探索提供方向。
数据准备
数据样式为一般长格式数据,即行为观测个体、列为具体观测值。
距离计算
一般情况下,常用的距离算法是欧氏距离Euclidean distance,R语言dist()函数调用的默认计算方式也是欧式距离,当然还有Squared Euclidean distance、Manhattan distance、Maximum distance、Mahalanobis distance等和适合非数字型数据的Hamming distance 或Levenshtein distance 也是常用的距离计算方式。
不仅如此,也可以用相关距离如:皮尔森相关距离(Pearson correlation distance)、艾森余弦相关距离(Eisen cosine correlation distance)、斯皮尔曼相关距离(Spearman correlation distance)和肯德尔相关距离(Kendall correlation distance)进行聚类分析(常用于基因表达矩阵)。
R语言实现
CRAN Task View包含了用于数据中搜寻分组信息、建模和可视化的常用包。dist()函数时最常用的距离计算函数;daisy()函数可以用于计算非数值型的观测值间的距离,此时高尔系数将自动用作距离度量。factoextra包用于聚类结果提取和可视化。dendextend包用于两种系统树图的比较。philentropy包和distance函数实现了46个不同距离算法和相似性度量,主要包括了2种度量的计算方法:距离度量和信息度量。通过不同数据的相似度比较,为聚类、分类、统计推断、拟合优度、非参数统计、信息理论和机器学习提供了核心的计算框架,支持基于单变量或者多变量的概率函数的计算。
其他包:NbClust、fpc、vegan: 种群生态学数据常用包、apcluster:吸引力传播聚类是一种基于数据点之间的“信息传递”的聚类算法。与k-means等其它聚类算法不同的是,AP不需要在聚类前确定或估计类的个数,广泛应用于计算机视觉和计算生物学领域。pvclust:层次聚类
K-means 聚类
k-means聚类算法可能是最常用的聚类方法,也是许多更复杂的聚类技术的基础,只有好好了解了K-means聚类算法,才能更好的理解其他复杂的聚类技术。
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心,也就是调整集群边界,从而更新分配。更新和分配的过程会发生多次,直到更改不再改善集群的适合性。此时,流程停止,聚类完成。
R语言实现
1. 估计聚类的最优数量K
NbClust包中NbClust()函数:通过指定最大聚类数量和最小聚类数量后,NbClust()将运行一系列距离诊断进程,最终通过适合度投票的形式确定最佳聚类数量。其输出结果包括集群数目和相应的票数柱状图和elbow 图(突出“手肘”点就是最佳分组数目)。
fpc包中的pamk()函数:利用分组间的最小差异作为决定因素,找到最佳聚类数量。
vegan包中的cascadeKM()函数:首先指定可能的分组数量,通过迭代指定的次数后评估不同分组数量间的差异,获得热图和calinski criterion图诊断结果。
mclust包中的Mclust()函数:根据数据中的贝叶斯信息准则(BIC)进行分组数目确定。指定分组范围后,该函数最终输出BIC和分组数据图(最低点为最适组数)、各组分相关性图和密度图,当然可以用summary()函数直接显示检测结果,并根据最小BIC(Clustering table中的数值)确定最佳分组数量。
apcluster包,由于AP不需要在聚类前确定或估计分组个数,所以完全可以利用它来找到适合的分组数目。
cluster中的clusGap()函数:通过计算分组值的聚类优度度量或差距统计值,报告最佳分组数目结果。以logW和E.logW的差值(gap)为y轴,分组数量为x轴,SE.sim (Standard Error)即可作带bar的折线图,其中最高gap所在的x轴为最佳分组数量。
2.聚类
kmeans(x, centers, iter.max = 10, nstart = 1,
algorithm = c("Hartigan-Wong", "Lloyd", "Forgy",
"MacQueen"), trace=FALSE)
# nstart 表示初始随机分配数量,最好设定较高(25-50),利于找到稳定结果。
3.可视化
fviz_cluster()简易一步可视化函数。
4. 优缺点
需要提前知道K值
对离群值敏感
对初始随机分配中心敏感
数据顺序也可能影响结果
K-Medoids
均值的使用意味着k-means聚类对异常值非常敏感,但PAM算法提供了一种更稳健的解决方式。
pam()cluster{},用法基本与K-means相同。
层次聚类(Hierarchical Clustering)
层次聚类是一种将数据中相似的观测值排列聚集到一起的非参数方式,是k-means聚类的另一种方法,它不需要我们像k-means方法那样预先指定要生成的集群的数量。以非参的方式进行聚类,然后利用树状图展示聚类结果,以便发现其中存在的离群值或分组模式。
层次聚类的层次法(Hierarchical methods)先计算样本之间的距离,每次将距离最近的点合并到同一个类。然后再计算类与类之间的距离,将距离最近的类合并为一个大类。不停的合并,直到合成了一个类。其中类与类的距离的计算方法有:最短距离法,最长距离法,中间距离法,类平均法等。据层次分解的顺序可以分成自下向上和自上向下两种,自下而上法(Agglomerative)就是一开始每个个体(object)都是一个类,然后根据距离寻找同类,逐级向上合并,最后形成一个类群。自上而下法就是反过来,一开始所有个体都属于一个类群,然后根据距离关系排除异己,逐级向下分开,最后每个个体都成为一个类。
层次聚类方法
比较常用的聚类的方法叫做agglomerative hierarchical clustering(自下而上)的聚类,描述起来比较简单,但是计算复杂度比较高,为了寻找距离最近/远和均值,都需要对所有的距离计算个遍,需要用到双重循环。
单连接聚合(single-linkage)聚类—取两个类中距离最近的两个样本的距离作为这两个集合的距离,最后会得到比较松散的聚类簇 。
完全连接聚合(complete-linkage)聚类 — 是 Single Linkage 的反面极端,取两个集合中距离最远的两个点的距离作为两个集合的距离,因此有的簇本来可以是一类,但由于极端点造成他们无法合并,倾向于找到紧凑的分组。
平均聚合聚类 — 取类之间的距离的平均值或中值,分为:使用算术平均的非权重成对组法(UPGMA)、使用质心的非权重成对组法(UPGMC)、使用算术平均的权重成对组法(WPGMA)、使用质心的权重成对组法(WPGMC);
Centroid linkage clustering:它计算簇1的质心(长度p变量的平均向量)和簇2的质心之间的差异。
Ward最小方差聚类 — ,分组的依据是使组内平方和(即方差分析的方差)最小化,旨在找到紧凑的球形分组。
R语言实现
这个CRAN Task View包含了用于数据中搜寻分组信息、建模和可视化的常用包。factoextra包用于聚类结果提取和可视化。dendextend包用于两种系统树图的比较。philentropy包和distance函数实现了46个不同距离算法和相似性度量,主要包括了2种度量的计算方法:距离度量和信息度量。通过不同数据的相似度比较,为聚类、分类、统计推断、拟合优度、非参数统计、信息理论和机器学习提供了核心的计算框架,支持基于单变量或者多变量的概率函数的计算。pvclust是R中比较流行的层次聚类包。
在R中调用hclust()函数,修改method就可以完成大多数的聚类工作;而plot函数又能很好的对输出结果进行可视化。
hclust(d, method = "complete", members = NULL)
plot(x, labels = NULL, hang = 0.1, check = TRUE,
axes = TRUE, frame.plot = FALSE, ann = TRUE,
main = "Cluster Dendrogram",
sub = NULL, xlab = NULL, ylab = "Height", ...)
如果想用其他包进行可视化,那么hclust {stats}生成的描述聚类的过程的hclust对象可以转化为嵌套list的dendrogram对象,可以用ape::as.phylo()转化为phylo对象,然后用ggtree进行ggplot2类型的可视化。
模型评估
层次聚类后的数据用plot或ggtree进行聚类树展示,我们即可直观地观测样本分布及各样本中个体间的整体差异。但面对众多的聚类方法,我们就需要通过模型评估来选择一个最具代表性的聚类结果。
philentropy包和distance函数实现了46个不同距离算法和相似性度量,主要包括了2种度量的计算方法:距离度量和信息度量。通过不同数据的相似度比较,为聚类、分类、统计推断、拟合优度、非参数统计、信息理论和机器学习提供了核心的计算框架,支持基于单变量或者多变量的概率函数的计算。
1. 共轴距离相关
任意两个对象,在聚类树上从一个对象向上走,到达与另一个对象交汇点向下走,势必会到达第二个对象,交汇点所在的层次水平即是两个对象共轴距离。聚类后的两个观测值之间的共轴距离被定义为两个观测值首次合并成单个聚类时的组间差异。可以认为,如果原始距离与共轴距离之间的相关性很高,则该树状图是是比较适合聚类模型。
可通过cophenetic()获取聚类树中两两对象间的共轴距离矩阵,然后利用cor()函数计算共轴距离矩阵和原始距离矩阵相关系数(pearson)。
2. Gower距离
Gower距离等于原始距离与共轴距离之间差值的平方和。一般来讲,具有最小Gower距离的聚类方法也可视为最具代表原始距离的聚类模型。
gow_asingle <- sum((dis_matrix - clust_matrix)^2)
# philentropy
参考文献
R for Data Science - Learn and explore the fundamentals of data science with R by - Dan Toomey
Practical Guide To Cluster Analysis in R - Unsupervised Machine Learning by - Alboukadel Kassambara