聚类算法之其他常见算法

Posted 数据分析师成长之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚类算法之其他常见算法相关的知识,希望对你有一定的参考价值。

本篇大纲:

1、聚类算法的基本类型

2、聚类算法的一些评价指标

3、各种聚类算法的基本原理及相应流程

4、不同数据分布下不同聚类算法的聚类效果展示

 


上期回顾


1、我们先做了基本铺垫,介绍了一下什么是聚类,并给出了常见的一些距离度量方式和相似度计算方式。


2、我们以kmeans为引例,介绍了它的基本算法流程以及常见的迭代终止条件。并简单叙述了一下其簇心更新方式的理论依据。


3、我们提出了kmeans的三个缺点:异常点导致偏差严重、初值敏感、更新簇心迭代效率慢。并根据每个缺点,提出了相应的解决算法,如对于异常点导致偏差严重,则可以使用k中值法。对于初值敏感,则可以用kmeans++和二分kmeans,而对于二分kmeans由于同样有选择簇心效率慢,则对应有kmeansII的算法改进。对于更新簇心迭代效率慢,则可以使用minibatch Kmeans算法。


4、我们简单提了一下kmeans的应用场景并给出了kmeans的自我实现版本。



没事唠一唠


如果说对于聚类并不是具有很高要求或者说并没有在很多维度上都有限制的话,kmeans就足够了,但若是从学习知识和拓展视野的角度,或者说需要更多维度上来进行精度考虑的话,就有必要去了解一下其他聚类算法的算法流程及适用场景了。




聚类算法的常见类型


上一篇中我们提到,聚类算法其实有很多,包括层次聚类,密度聚类,谱聚类等等。实际上,这么提并不是非常严谨,因为从整体上而言,聚类算法有以下几大分类。


一、原型聚类

原型聚类包含以下一些常见聚类算法:如Kmeans、Canopy、高斯混合聚类等等。


二、层次聚类

层次聚类包含以下一些常见聚类算法:如凝聚的层次聚类(AGNES)、分裂的层次聚类(DIANA)、聚类特征树(CF-Tree)、使用代表点的聚类法(Cure)、平衡迭代消减聚类法(Birch)等。


三、密度聚类

密度聚类包含以下一些常见聚类算法:DBScan算法和密度最大值算法(MDCA)等。


四、其它一些聚类算法

主要包括网格聚类、模型聚类、核聚类和谱聚类等模型聚类算法。

当然,这里如果根据聚类学习策略来细分的话,网格聚类、模型聚类等都可以单属一类。为简单概括,这里都归属到其它聚类算法离。


这么看来,聚类算法似乎很多,出发点和目标都是一致的,方法却很多,这就使得在业务处理中,对于具体使用哪种方法,会有一定的困惑,实际上,不同的聚类算法,除了其具体的聚类算法流程不一样外,其伸缩性、适应的数据类型、异常数据的抗干扰能力、适应的数据分布形状、以及算法的效率都会有所差别。



聚类算法的常见评价指标


在提聚类算法的评价指标之前,简单回顾一下分类和回归的评价指标。


常见的分类算法指标有精确率、准确率、召回率、F值、AUC和ROC曲线等。


常见的回归算法指标有均方误差、绝对误差和R平方值等。


这里其实有一个特点,就是评价指标都会涉及到标签值,也就是说,会去利用预测的标签值和真实的标签值进行一些计算。


那么,同样的,出于学习和研究的目的,聚类算法也有基于真实标签值的评价指标,换一句话说,也就是我们先有了预期的数据,后用聚类算法去检验算法效果。但是,实际上聚类算法又属于无监督学习,故而抛开学习和研究的场景,在实际应用中,聚类算法的目标是聚类,并不需要数据具备标签,或者说也可能并不具备获取真实标签的条件,故而又有不基于真实标签的评价指标。


故而如果从学习和研究的角度出发,我们可以得到目标聚类数据的真实标签,那么其对应的评价标准有如下一些:


一、混淆矩阵

这里的混淆矩阵,说白了,其实就是分类算法中所涉及的混淆矩阵,能根据混淆矩阵得到精确率、准确率、召回率和F值。


二、均一性

若一个簇中只包含一个类别的样本,则满足均一性。

其具体计算过程类似于精确率(每个聚类簇中正确分类的样本数占该聚类簇总样本数的比例和),只是这里会遍历每个簇,然后相加求平均。

三、完整性

若同类别样本被归属到相同的簇中,则满足完整性。

其具体计算过程类似于召回率(每个聚簇中正确分类的样本数占该类型的总样本数比例和),只是这里会遍历每个簇,然后相加求平均。

聚类算法之其他常见算法

四、V-measure

均一性和完整性的加权平均,其计算过程有些类似于F值的计算。

聚类算法之其他常见算法

当然,这里聚类效果最好的情况下,即p=1,r=1,故而v也等于1。

不同聚类场景下,越接近于1,也就效果越好。


五、兰德系数和调整兰德系数

兰德系数在某种程度上有点像正确率的计算方式。

假定U集合为真实聚类效果集合,即“真实标签”,而V集合为自己的聚类结果,即“预测结果”。

我们定义:

a为在U中属于同一类别并且在V中也是属于同一簇的点的对数。

b为在U中属于同一类别但在V中却不属于同一簇的点的对数。

c为在U中不属于同一类别但在V中却属于同一簇的点的对数。

d为在U中不属于同一类别并且在V中也不属于同一簇的点的对数。

由于每对数据点只能存在于一个abcd中的一个集合中。

故而a+b+c+d=C(m,2),m即为总的数据点数目。

聚类算法之其他常见算法

而兰德系数对应公式如下:

聚类算法之其他常见算法

从式子上可以看出,当聚类时对于各个数据点划分到对应簇时分类完美时,那么对应的兰德系数则为1,完全错误时,则兰德系数为0。效果越好,则越接近1。


虽然兰德系数在一定程度上能描述数据点归类到对应簇时的准确度,但是却并不是非常准确,因为假定我们随意地对数据点进行划分之后,会发现,依然会有很多点被分布对,其兰德系数也并不是非常接近0,故而后来就有了改进,称之为调整兰德系数,扩大了兰德系数的取值范围,也能更好地处理归类错误的情况,其对应式子如下:

聚类算法之其他常见算法

六、互信息和调整互信息

互信息和调整互信息的流程整体上与兰德系数和调整兰德系数比较相似。

其内部主要是使用的信息熵进行计算。具体公式如下:

聚类算法之其他常见算法

有兴趣的小伙伴可以自行去研究一下。


而从实际应用的角度出发,我们并不知道目标聚类数据的真实标签,以及聚类算法本身的无监督特性,我们也有对应的评价指标,即轮廓系数。


轮廓系数是通过簇内不相似度和簇间不相似度计算而来。


簇内不相似度

记样本i到同簇中其它样本的平均距离为a(i),那么a(i)越小,则代表样本i越应该被聚类到该簇中,而簇中所有样本的a(i)的均值则被称为该簇的簇内不相似度。


簇间不相似度

记样本i到其它簇(如C(j)簇)中所有样本的平均距离为b(i,j)

b(i)=Min(b(i,j))=Min{b(i,1),b(i,2),...,b(i,k)}

b(i)越大,则越代表该样本不应该属于其他簇。

这里之所以取Min,是因为若该样本连其最近的临近簇都不属于,那么更远的其它簇,自然也更不会属于了。


轮廓系数

样本i的轮廓系数用s(i)来表示。

s(i)值越接近于1,则表示样本i聚类越合理。

s(i)值越接近于-1,则表示样本i越应该聚到其它簇中。

s(i)值越接近于0,则表示样本i应该在边界上。

所有样本的s(i)值的均值则被称为整体聚类结果的轮廓系数。

具体公式如下:

聚类算法之其他常见算法

故而一般而言,若轮廓系数在0.6以上,则表示聚类效果还不错。

若轮廓系数在0.8以上,则代表该模型结果属于高度聚类。


从实际应用上看,轮廓系数应该是目前评价聚类效果的最好方法。




各类聚类算法的典型示例


因算法模型太多,展开太长,这里我们对于各类型聚类算法都选择性地描述一些。其它不具备的,有兴趣的小伙伴请自行查阅。


一、原型聚类


原型聚类指的是聚类结构可以通过原型刻画一遍,即在样本空间中可以使用若干具有代表性的点刻画描述出来。


经典的原型聚类算法有Kmeans、Canopy和混合高斯聚类。kmeans我们在上一篇已经详细阐述过,就不再赘述。


Canopy算法属于一种“粗”聚类算法,执行速度较快,但精度较低。

其算法流程如下:


1、给定样本列表L=x1,x2,...xm以及先验值r1和r2(r1>r2),这里的r1和r2都是指半径,即已知的半径大小。

2、从列表L中获取一个节点P,计算P到所有聚簇中心点的距离(如果不存在聚簇中心,那么此时点P形成一个新的聚簇),并选择出最小距离D(P,a(j))。换句话说,也就是若目前暂时无簇心,则P节点作为新簇心。若已有簇心,则找到距离最近的簇心,计算P节点与它的距离,记为D。

3、如果距离D小于r1,表示该节点属于该聚簇,添加到该聚簇列表中

4、如果距离D小于r2,表示该节点不仅仅属于该聚簇,还表示和当前聚簇中心点非常近,所以将该聚簇的中心点设置为P,并将P从列表L中删除。

5、如果距离D大于r1,那么节点P形成一个新的聚簇 直到列表L中的元素数据不再有变化或者元素数量为0的时候,结束循环操作。

文字描述可能会略有干涩,附上图形描述:

聚类算法之其他常见算法

通过这幅图可以看出,给定了r1和r2之后,簇半径也就确定了。也就是分别以T1和T2作为分割线形成了总共三块区域。


首先遍历找到了节点D,然后将其作为簇心,而后寻找到了节点C,与C最近的簇心为节点D,两者之间的距离小于r2,故而节点C必定属于且只属于以D为簇心的簇。继而寻找到了节点B,那么由于B到簇心D的距离大于r2,小于r1,故而节点B既可能属于以D为簇心的簇,也可能属于其他簇。而最后寻找到的节点A,由于其与节点D的距离大于r1,故而节点A必定不属于以D为簇心的簇。


可以看出,Canopy算法有几个特点:

1、簇半径r1和r2需要先验给定,太大会导致簇太少,太小会导致簇太多,但是这个平衡,可以在实际中调整,并观察效果来确定。

2、Canopy算法得到的最终结果的值,各聚簇之间是可能会存在重叠的,但是并不会存在某个节点不属于任意一个簇的情况,因为它完全可以自立一簇,作为簇心存在。

3、Canopy算法聚类效果比较粗,但是执行速度快,故而可以先使用该算法进行粗聚类,得到簇心之后再进行进一步的细聚类。

4、由于Canopy算法不需要指定k值,也不存在Kmeans算法的初值敏感问题,也就是说,它的限制性因素会更少,所以它的适用场景也就更广泛,当然,不同数据类型,聚类效果肯定不一样,前面我们已经提过,就不再赘述。


=====================================================


二、层次聚类算法


层次聚类算法主要是对给定数据集进行按层次划分,迭代至终止条件。


传统的层次聚类主要分两大类算法:


凝聚的层次聚类:AGNES算法,其核心在于自底向上的策略。最初将每个数据作为一个簇,按照一定规则一步一步合并起来,比如每次将簇间距离最近的两个簇合并成一个簇,而簇间距离可以由两个不同簇中距离最近的数据点的相似度来确定。聚类的合并过程反复进行直到所有的对象满足簇数目。


分裂的层次聚类:DIANA算法,其核心在于自顶向下的策略。最初将所有数据作为一个簇,按照一定规则一步一步拆解开来,比如每次以最大距离进行划分(即划分后两簇的距离是最大的),而簇间距离可以是最大距离,也可以是其它如平均距离。聚类的拆解过程反复进行直到达到某个终止条件(簇数目或者簇间距达到阈值条件)。


这里一般的距离度量方式有三种:


1、最小距离

即两个聚簇中最近的两个样本之间的距离。

缺点:容易产生链式结构。

举例:一条线上等间距七个点进行聚类。若以最小距离来做凝聚的层次聚类,那么就极可能发生从左到右一个一个吃掉,大鱼吃小鱼的既视感。而若是两个月牙相交型数据,若以最小距离来聚类,那么很可能两个月牙形数据会交叉在一块,分不出你我。


2、最大距离

即两个聚簇中最远的两个样本的距离。

缺点:如果存在异常值,则构建可能不稳定。

举例:考虑kmeans中的异常值导致误差偏大的情况。


3、平均距离

即两个聚簇中样本间两两距离的平均值或者两两距离中的中值。

从整体上看,使用平均距离能有一定的降噪功能,同时,也能避免最小距离在某种情况下造成的链式结构问题,故而不会太差,也较平滑一些。


整体看来,AGNES和DIANA两种算法原理简单,理解起来也容易,但其缺点一样明显。

1、合并点/分裂点不好选择

2、合并/分裂的操作不好撤销

3、执行效率低O(t*n^2),t为迭代次数,n为样本点,大数据集下尤其不合适。


当然,层次聚类中还有一些其它经典算法,比如BIRCH算法和CURE算法,这里就不展开叙述,有兴趣的小伙伴可以自行了解一下。


=====================================================


三、密度聚类算法


密度聚类算法主要是对所有样本点进行密度划分,只要样本点的密度大于某个阈值,就将该样本点添加到最近的簇中。换一句话说,即其聚类过程中,若点之间的密度足够,则连接起来,若密度不够,则没法连接,故而密度聚类整体上效果会比较好。


这类算法可以发现任意形状的聚类,而且并不会发生异常数据敏感的现象。具备很强的抗噪能力,即能够很好地过滤出噪声点。因为所谓噪声点,也就是那些不合群点,由于其密度值不够,所以往往会很容易被剥离出来。

但是密度聚类的计算复杂度高,计算量大,故而整体运行速度慢,所以在比较注重速度时,密度聚类算法则一般不会考虑。


密度聚类的常见算法有DBSCAN和密度最大值算法MDCA。


这里我们详细阐述一下DBSCAN算法,对于MDCA算法,有兴趣的小伙伴可以自行查阅一下。


DBSCAN是一个比较有代表性的密度聚类算法。


在提DBSCAN算法之前,我们需要先了解几个背景概念:


一、ε邻域

空间中任意给定一个点x,则以该点为中心,半径长度为ε的空间领域即为点x的ε邻域


二、密度:

以样本点x为中心的ε邻域中,总样本点的个数即为该空间的密度。


三、核心点

我们首先人为设定阈值为正整数M,若样本点x其ε邻域空间里的密度大于等于M,我们则称样本点x为核心点。相反,若样本点y其ε邻域空间里的密度小于M,则该样本点y属于非核心点。


四、边界点

若非核心点x的ε邻域中存在核心点,那么就认为该样本点x是核心点对应的边界点。


五、噪音点

所有样本点的集合中,除了边界点和核心点之外的点都是噪音点。


六、直接密度可达

给定一个对象集合,如果其中的样本点y是在样本点x的ε邻域内,而且样本点x是一个核心点,那么就可以说,对象y从对象x出发是直接密度可达的。换一句话说,也就是以x为核心的ε邻域内,可以找到样本点y,即可以说明y与x之间是直接密度可达的。


七、密度可达

如果存在一个对象链P1P2P3...PiPi+1...Pn,满足样本点Pi+1与Pi之间是直接密度可达的,即两两之间是直接密度可达的,那么就可以称Pn与P1是密度可达的。


八、密度相连

在数据集合中,如果样本点x和样本点y是关于ε(邻域半径)和 M (密度阈值)密度可达的,那么我们就称x和y是关于ε和 M 密度相连的。


九、簇

一个基于密度的簇其所有样本构成的样本集合C,必须满足以下两个条件:

1、对于集合C中的任意两个样本点x和y,若x属于C,y也属于C,则x和y必定是密度可达的。

2、对于集合C中的任意两个样本点x和y,若x属于C,y也属于C,则x和y必定是密度相连的。


基本概念到这里就差不多了,然后我们开始叙述DBSCAN算法。


首先,DBSCAN算法的核心思想为:用一个点的ε邻域内的邻居点数衡量该点所在空间的密度。


其具体算法流程如下:

1、若一个样本点x的ε邻域包含多于人工设定的密度阈值M,则创建一个以x为核心点的新簇。

2、寻找并合并核心点直接密度可达的所有样本点。

3、没有新点可以更新簇的时候,整体算法结束。


从算法流程中可以看出,密度聚类DBSCAN的核心参数即邻域半径ε和邻域密度阈值M。


邻域半径ε越大,则越能容忍噪声点,当然,效果可能会随之下降。

邻域半径ε越小,则形成的簇越多,越不能容忍噪声点,但效果,也并不一定就越好。


相似的,密度阈值M越小,说明邻域构成所需要的点越少,则越能容忍噪声点,密度阈值M越大,则说明邻域构成所需要的点越多,则更容易将正常有效点划分到噪声点的集合里。


相应的,密度聚类DBSCAN的优缺点如下:


优点:

1、和Canopy相似,DBSCAN算法也不需要事先给定聚类簇的数目。

2、DBSCAN对于数据形状比较具有普适性。

3、具有较好的抗噪能力,并不会发生异常值敏感的现象。

4、算法参数较少,只有邻域半径ε和密度阈值M。

5、聚类结果不依赖节点的遍历顺序。


缺点:

1、聚类效果比较依赖距离公式的选择,最常用的是欧式距离度量方式。但对于高维数据,特征变量成百上千维时,距离度量方式不会有太大的影响力。

2、DBSCAN算法不适合数据集中密度差异很大的情况。


由于密度聚类效果比较好,同时又能筛选出噪声点,故而在特征工程中,可以考虑使用密度聚类来过滤噪音数据。但是由于真实数据中,往往特征变量维度都成百上千,也无法清除聚类效果的好坏,故而维度越高的情况下,效果越不好。


还有其他一些聚类算法,如谱聚类等,这里就不再展开叙述了。



不同数据分布下不同聚类算法的聚类效果展示


以下是不同数据分布下几种典型聚类算法的聚类效果展示:

每一行代表一种类型的数据(特殊的,第四行是纯随机数据,即应该整体属于一簇),每一列代表一种聚类算法的效果展示,不同颜色代表聚类结果不属于一个簇。


整体而言,谱聚类和密度聚类效果最好,但是这两种方式的速度都很慢,实用性不强,但另一方面,当维度较少的时候,可以使用它们来做噪声过滤。


虽然看起来kmeans对数据的适用性并不强,但由于现实中,数据多为第三行类型的数据,即符合高斯分布的簇形数据,故而使用kmeans效果也差不多,事实上,也是使用kmeans聚类的频率最高。


当然,若在处理真实数据时,使用kmeans效果若并不是很好的话,则可以直接考虑使用DBSCAN,因为两者适用的数据集类型正好互补。若数据量很少时,则也可以考虑使用谱聚类。




排版不佳,还请见谅。


快乐需要传递,知识需要分享。


如果感觉还不错,请帮忙分享推广。



更多文章请关注


以上是关于聚类算法之其他常见算法的主要内容,如果未能解决你的问题,请参考以下文章

聚类算法综述

新版白话空间统计(41):常用聚类算法分类之划分法与专业聚类算法包Pyclustering

四种聚类方法之比较

聚类算法之K均值算法(k-means)的Python实现

聚类算法都有哪些

数据聚类常见聚类算法的基本原理[图解]