聚类分析

简介

聚类分析用于识别并集中多元数据中相似的对象,观测值(或个体)之间的相似性是通过一些距离度量来定义的,包括欧几里得距离度量和基于相关关系的距离度量。聚类方法分为以k-means为代表的分区聚类(Partitioning clustering)和层次聚类两种。

用途

  1. 将目标划分为相似群体

  2. 寻找离群的异常表现个体

  3. 将大量高纬度数据简单化

总的来说,聚类在利用较少的分组来代表各种不同的数据中具有非常好的作用。它产生了有意义和可操作的数据结构,减少了数据复杂性,并为数据关系模式的探索提供方向。

数据准备

  1. 数据样式为一般长格式数据,即行为观测个体、列为具体观测值。

  2. NA值处理和数据标准化。

距离计算

一般情况下,常用的距离算法是欧氏距离Euclidean distance,R语言dist()函数调用的默认计算方式也是欧式距离,当然还有Squared Euclidean distance、Manhattan distance、Maximum distance、Mahalanobis distance等和适合非数字型数据的Hamming distanceLevenshtein 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(自下而上)的聚类,描述起来比较简单,但是计算复杂度比较高,为了寻找距离最近/远和均值,都需要对所有的距离计算个遍,需要用到双重循环。

  1. 单连接聚合(single-linkage)聚类—取两个类中距离最近的两个样本的距离作为这两个集合的距离,最后会得到比较松散的聚类簇 。

  2. 完全连接聚合(complete-linkage)聚类 — 是 Single Linkage 的反面极端,取两个集合中距离最远的两个点的距离作为两个集合的距离,因此有的簇本来可以是一类,但由于极端点造成他们无法合并,倾向于找到紧凑的分组。

  3. 平均聚合聚类 — 取类之间的距离的平均值或中值,分为:使用算术平均的非权重成对组法(UPGMA)、使用质心的非权重成对组法(UPGMC)、使用算术平均的权重成对组法(WPGMA)、使用质心的权重成对组法(WPGMC);

  4. Centroid linkage clustering:它计算簇1的质心(长度p变量的平均向量)和簇2的质心之间的差异。

  5. 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

参考文献

  1. R for Data Science - Learn and explore the fundamentals of data science with R by - Dan Toomey

  2. Practical Guide To Cluster Analysis in R - Unsupervised Machine Learning by - Alboukadel Kassambara

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容