聚类算法实践经验汇总

聚类算法汇总(附代码) 聚类算法汇总(附代码) 本次整理了聚类工程里面常见算法,以及给出合适的工程结构方便调用,编写常用的聚类指标当作聚类结果函数,并Github链接在文末,供大家交流学习。 文章目录聚类算法汇总(附代码)前言一、KMeans算法二、Kernel-Kmeans算法三、AP聚类算法四、谱聚类算法五、总结 前言 “物以类聚,人以群分” 下面介绍几种聚类算法 一、KMeans算法 主要实现了肘部法确定聚类簇数,以及调用python的库函数进行聚类,可以参考我前面的博文 二、Kernel-Kmeans算法 这一部分在 阅读详情


所谓聚类,就是将相似的事物聚集在一起,而将不相似的事物划分到不同的类别的过程,是数据分析之中十分重要的一种手段。比如古典生物学之中,人们通过物种的形貌特征将其分门别类,可以说就是一种朴素的人工聚类。如此,我们就可以将世界上纷繁复杂的信息,简化为少数方便人们理解的类别,可以说是人类认知这个世界的最基本方式之一。

      在数据分析的术语之中,聚类和分类是两种技术。分类是指我们已经知道了事物的类别,需要从样品中学习分类的规则,是一种有指导学习;而聚类则是由我们来给定简单的规则,从而得到分类,是一种无指导学习。两者可以说是相反的过程。

       网上关于聚类算法的资料很多,但是其实大都是几种最基本的方法,如K-means、层次聚类、SOM等,以及它们的许许多多的改进变种。这里,我就来讨论一下这些聚类算法,对它们的表现做一个简单的评估。因为内容有点多(其实主要是图占位置……),所以准备分几次来完成。

 

0、测试数据集

      在介绍这些算法之前,这里先给出两个简单的测试样品组,下面每介绍完一个算法,可以直接看看它对这两个样品组的聚类结果,从而得到最直观的认识。 

下图就是两个简单的二维样品组:

1)第一组样品属于最基本的聚类测试,界线还是比较分明的,不过三个cluster的大小有较明显差异,可以测试一下算法对cluster size的敏感度。样品总共有2000个数据点

2)第二组是典型的甜甜圈形。使用这样的测试组主要是为了考察算法对cluster形状敏感度。共有1500个数据点。

聚类算法

聚类算法

      对于这样的两个样品组,人类凭肉眼可以很容易地判断它们应该分为三个cluster(特别是我还用颜色做了区分……),但对于计算机就不一定了,所以就需要有足够优秀的聚类算法。

 

1、相似性度量

      对于聚类,关键的一步是要告诉计算机怎样计算两个数据点的“相似性”,不同的算法需要的“相似性”是不一样的。

      比如像以上两组样品,给出了每个数据点的空间坐标,我们就可以用数据点之间的欧式距离来判断,距离越近,数据点可以认为越“相似”。当然,也可以用其它的度量方式,这跟所涉及的具体问题有关。

 

2、层次聚类

     层次聚类,是一种很直观的算法。顾名思义就是要一层一层地进行聚类,可以从下而上地把小的cluster合并聚集,也可以从上而下地将大的cluster进行分割。似乎一般用得比较多的是从下而上地聚集,因此这里我就只介绍这一种。

      所谓从下而上地合并cluster,具体而言,就是每次找到距离最短的两个cluster,然后进行合并成一个大的cluster,直到全部合并为一个cluster。整个过程就是建立一个树结构,类似于下图。

聚类算法

      那么,如何判断两个cluster之间的距离呢?一开始每个数据点独自作为一个类,它们的距离就是这两个点之间的距离。而对于包含不止一个数据点的cluster,就可以选择多种方法了。最常用的,就是average-linkage,即计算两个cluster各自数据点的两两距离的平均值。类似的还有single-linkage/complete-linkage,选择两个cluster中距离最短/最长的一对数据点的距离作为类的距离。个人经验complete-linkage基本没用,single-linkage通过关注局域连接,可以得到一些形状奇特的cluster,但是因为太过极端,所以效果也不是太好。

      层次聚类最大的优点,就是它一次性地得到了整个聚类的过程,只要得到了上面那样的聚类树,想要分多少个cluster都可以直接根据树结构来得到结果,改变cluster数目不需要再次计算数据点的归属。层次聚类的缺点是计算量比较大,因为要每次都要计算多个cluster内所有数据点的两两距离。另外,由于层次聚类使用的是贪心算法,得到的显然只是局域最优,不一定就是全局最优,这可以通过加入随机效应解决,这就是另外的问题了。

    

聚类结果

      对样品组1使用average-linkage,选择聚类数目为4,可以得到下面的结果。右上方的一些异常点被独立地分为一类,而其余的数据点的分类基本符合我们的预期。

聚类算法

      如果选择聚类数目为5,则是下面的结果。其中一个大的cluster被分割,但没有出现均匀分割的情况(比如K-means),只有少量的数据点被分离,大体的分类还是比较正确的。因此这个算法可以处理大小差别比较大的聚类问题,对cluster size不太敏感。

聚类算法

      如何确定应该取多少个cluster?这是聚类里面的一个非常重要的问题。对于层次聚类,可以根据聚类过程中,每次合并的两个cluster的距离来作大概判断,如下图。因为总共有2000个数据点,每次合并两个cluster,所以总共要做2000次合并。从图中可以看到在后期合并的两个cluster的距离会有一个陡增。假如数据的分类是十分显然的,就是应该被分为K个大的cluster,K个cluster之间有明显的间隙。那么如果合并的两个小cluster同属于一个目标cluster,那么它们的距离就不会太大。但当合并出来K个目标cluster后,再进行合并,就是在这K个cluster间进行合并了,这样合并的cluster的距离就会有一个非常明显的突变。当然,这是十分理想的情况,现实情况下突变没有这么明显,我们只能根据下图做个大致的估计。

聚类算法

 

      对于测试样品2,average-linkage可谓完全失效,这是由于它对“相似性”的理解造成的,所以只能得到凸型的cluster。

      总体而言,像average-linkage这样的算法还是比较稳定的,可以大致地判断聚类数目,聚类效果也不错,在数据量比较小的时候可以使用。

 

3、K-means算法

      K-means是最为常用的聚类方法之一,尽管它有着很多不足,但是它有着一个很关键的优点:快!K-means的计算复杂度只有O(tkn),t是迭代次数,k是设定的聚类数目,而n是数据量,相比起很多其它算法,K-means算是比较高效的。

      K-means的目标是要将数据点划分为k个cluster,找到这每个cluster的中心,并且最小化函数

其中就是第i个cluster的中心。上式就是要求每个数据点要与它们所属cluster的中心尽量接近。

      为了得到每个cluster的中心,K-means迭代地进行两步操作。首先随机地给出k个中心的位置,然后把每个数据点归类到离它最近的中心,这样我们就构造了k个cluster。但是,这k个中心的位置显然是不正确的,所以要把中心转移到得到的cluster内部的数据点的平均位置。实际上也就是计算,在每个数据点的归类确定的情况下,上面函数取极值的位置,然后再次构造新的k个cluster。这个过程中,中心点的位置不断地改变,构造出来的cluster的也在变化(动画请看这里)。通过多次的迭代,这k个中心最终会收敛并不再移动。

      K-means实际上是EM算法的一个特例(关于EM算法,请猛击这里和这里),根据中心点决定数据点归属是expectation,而根据构造出来的cluster更新中心则是maximization。理解了K-means,也就顺带了解了基本的EM算法思路。

      实际应用里,人们指出了很多K-means的不足。比如需要用户事先给出聚类数目k,而这个往往是很难判断的;又如K-means得到的是局域最优,跟初始给定的中心值有关,所以往往要尝试多个初始值;总是倾向于得到大小接近的凸型cluster等等。

      K-means算法相比起上面提到的层次聚类,还有一个很大的不同,那就是它需要数据点的坐标,因为它必须要求取平均,而层次聚类实际上并不需要坐标数据,只需要知道数据点之间的距离而已。这也就是说K-means只适用于使用欧氏距离来计算数据点相似性的情况,因为如果采用非欧距离,那么也不能通过简单的平均来得到cluster中心。

 

聚类结果

       取k=3,K-means对样品组1聚类得到下面两张图。为什么是两张图呢?正如前面所说,K-means的聚类结果跟初始中心选择有关,而不是所有的的初始值都能保证聚类成功的,下面第二张就是失败的例子。另外由于K-means总倾向于得到接近大小的cluster,所以可以看到两个小的cluster对大cluster的“入侵”。

      对甜甜圈样品组,K-means也是完全没辙。

      从上面的结果可以看出,K-means的聚类效果确实不是很好。用户如果选择了不正确的聚类数目,会使得本应同一个cluster的数据被判定为属于两个大的类别,这是我们不想看到的。因为需要数据点的坐标,这个方法的适用性也受到限制。但是效率是它的一个优势,在数据量大或者对聚类结果要求不是太高的情况下,可以采用K-means算法来计算,也可以在实验初期用来做测试看看数据集的大致情况。

4、谱聚类

      一般说到谱聚类,都是从降维(Dimensionality Reduction)或者是图分割(Graph Cut)的角度来理解。但是实际上,从物理学的简正模式的角度,可以更为直观地理解这个算法的本质。

      这里先把基本的算法步骤写出来,然后再讨论算法的原理。

谱聚类基本步骤:

1、给出N个数据点两两之间的相似性。也就是一个N*N的相似性矩阵A,A(i,j)代表i和j两个数据点的相似度,数值越大则表示越相似。注意A(i,j)=A(j,i),A(i,i)=0。

2、计算矩阵D,使它的对角元是A矩阵的对应的那一列(或行)的值之和,其余地方为0。也就是使得

3、令B=D-A

4、求B矩阵的前k个本征值和本征矢,将数据点投影到一个k维空间。第i本征矢的第j个值,就表示第j个数据点在k维空间中第i维的投影。就是说如果把k个特征矢量并成一个N*k的矩阵,则每一行代表一个数据点在k维空间的坐标。

5、根据每个数据点的k维空间坐标,使用K-means或者其它聚类算法在k维空间对数据进行聚类。

      从算法的第4、5步就可以看出,谱聚类的本质实际上就类似于PCA,先将数据点投影到一个更能反映数据特征的空间,然后再用其它办法进行聚类。这也就是一种降维的思想(实际上也可能是升维)。那么问题的关键就在于,它把数据点投影到什么空间去了?为什么这个空间更能反映数据特征?这个问题可以从图分割的角度来理解(看这里),不过我这里要从简谐振动的角度来讨论这个问题,这也是一个更为直观的理解。

简正模式

      说起简谐振动,学过高中物理的童鞋都不会陌生:两个小球连上一根弹簧,就是最简单的简谐振动模型。为了简单起见,写成一维的形式,而且弹簧的平衡距离设为0,于是,当小球的坐标给定时,弹性势能就是

      我们把上面那个算法套用在这个例子上试试,两个小球的“相似度”就看成是它们之间弹簧的弹性系数k,k越大,小球之间的关系自然就越紧密了。这样上面要求的矩阵就是

          

      给出整个系统的坐标矢量,容易证明

      B只有两个本征矢量,分别是

    

       这两个本征向量就代表了体系的两个简正运动模式,向量中的值表示对应的小球在这个运动模式中的运动方向。比如p1之中两个小球往同一个方向运动,这其实是系统的整体平动,对应的本征值为0;p2则表示两个小球往相反方向运动,这就符合我们想象中这两个小球的简谐振动了。

       究竟什么是简正运动模式?为什么用上面的方法就能得到系统的简正运动模式呢?其实所谓的简正模式,就类似于傅立叶分析里面,用来将原函数展开的那组相互正交的基函数组。这里所使用的,就是简谐振动这样的一种基组,将整个系统的复杂运动表示为这些简正模式的叠加。

       无论我们有多少个小球,只要小球之间是以弹簧相连的,那么根据它们之间的连接方式,总是可以将系统的势能表示为

       但是,我们希望的是将运动方式去耦合,写成多个简正模式之和,也就是

所以需要对原来的B矩阵对角化,而对角化过程中得到的本征矢量和本征值,也就是所要求的简正模式以及它们的频率的平方值。

      上面说了那么多关于简正模的东西,可是到底为什么要求简正模呢?这是因为谱聚类的目的是要找到一个能很好地反映数据点特征的空间,然后在新空间中进行聚类。试着想象一下,如果两个数据之间相似性很大,那么也就是说它们之间的“弹簧”弹性系数很大,就跟用一个棒子连起来一样,那么自然在运动的时候,它们就会倾向于往同一个方向运动。类似地,如果一堆数据点之间很相似,那么它们就会形成一个rigid的整体,就像一个刚体一样,刚体内部的小球喜欢一起动。而两个刚体之间,则会产生简谐运动,倾向于往不同的方向运动。

       用一个简单的例子来说明这个现象,我们可以想象6个小球,分成对称的两组123和456,组内小球两两之间连在一起,两组之间则在3和4间有一根弹簧相连。这样一个结构,很明显应该是分为123和456两组。如果我们使用谱聚类,那么相似矩阵和求得的本征矢量如下

        

这里只列出本征值最小的前4个本征矢量:第一个一样是整体平动,没有什么意义;第二个表示两组小球之间的相对运动,两组小球往不同方向运动,这是我们想要得到的结果;第三、四个表示每组小球内部的相对运动。

       在这个结构里,组内部的相对运动相比起组间运动是很弱的,这可以从它们对应的本征值看出来。根据能均分定理,能量应该在每个简正模式之间均分,所以模式的振幅反比于它们的频率,也就是跟本征值的开方的倒数成正比,这里A2:A3:A4~3:1:1。这其实也就告诉了我们,对传统的谱聚类算法可以根据它的物理意义进行改进,根据本征值对本征矢量进行加权,而不是同一对待。这样,不重要的模式即便被考虑进来,因为振幅很小,所以也不会对结果产生什么影响。这样,我们在算法的第4步,考虑k个本征矢量来进行投影时,就不用担心会多取了多余的本征矢了,而且也可以根据本征值谱的变化来判断k的合理取值,就像在层次聚类中那样。

       对PCA比较熟悉的童鞋,会发现这个方法在形式上跟主元分析有类似的地方。其实简正模分析和PCA是两个相反的思路,简正模是根据系统的性质来推断系统的特征运动模式,而PCA则是根据系统的运动结果来得到特征方向。一个是从原理来进行推断,一个则是从结果来进行反推。

聚类结果

       使用谱聚类对样品1进行聚类,可以得到下图。两个结果分别对应聚类数目k取为3和8的情况,可以看到并不会像K-means那样把大的cluster分离,只会把少量异常点分离出去,总体的聚类结果十分稳定。因为算法最后还是使用了K-means进行聚类,所以我们可以想象谱聚类在投影到新空间的时候,应该是很好地把不同的cluster远远地分离了开来。

       可惜,谱聚类对特殊形状的cluster的聚类效果依然不尽如人意。不过相比起K-means这样的算法,谱聚类已经辨认出一些形状信息了(有成环状的cluster,而不是都是球型的)。

5、Chameleon聚类

      之前介绍的三个算法都没办法分辨出样品2的甜甜圈,而这次介绍的chameleon算法则可以说是专门用来干这活的。下面是算法的提出者在他们的文献中给出的一些测试组,可以看到这个算法就是对各类奇葩形状都应对自如……

聚类方法

       我们不妨来想当然地考虑一下,怎样才能识别出甜甜圈结构的cluster。简单起见,考虑最极端的情况,假设数据的噪声不是像样品2那么大,而是分界很明显的三个环带。想象我们把一只甲虫放在了其中一个环带上,甲虫的视野很小,而且它会随机地走到它能看到的数据点上。如果环带之间的间距足够大,那么甲虫就不会走到其它环带上。最后,甲虫能走到的区域就是一个环形的cluster。

       上面这个问题的关键就在于,要主动地把甲虫的视野变小,也就是根据近邻数据来进行聚类,然后不断延伸。这其实也就类似于层次聚类中的single-linkage,实际上single-linkage也确实可以识别出样品2。

       但是这样会带来新的问题,比如对于下面的情况。在fig 4中,如果只看最近邻的连接,算法会倾向于合并c、d而不是a、b,又或者说,如果甲虫的视野足够大到会合并a和b,那么c和d也就一定会被看作一个cluster。但事实上,a、b的邻接区域较大,距离也不远(相对于a、b内部),所以是应该被认为是属于同一个cluster,而c、d则显然不应该被看作一类。fig 5则表示另外一种情况,就是过分强调邻接区域的大小,这样就会倾向于把a与c进行合并,而不是与b合并。

聚类方法

       Chameleon算法就是努力在这两种情况之间保持平衡,既考虑Closeness,即近邻节点的靠近程度,也考虑Inter-Connectivity,即邻接区域的大小。

       Chameleon本质上也是一个从下而上的层次聚类算法,不过它只考虑每个节点邻近的K个节点(K由用户给定),也就是说,只有最接近节点的其它K个节点会被认为与节点存在连接。两个节点越“接近”,连接强度越强。两个cluster的“距离”由两个参量决定:relative inter-connectivity和relative closeness。

Relative Inter-Connectivity

cluster i和j的relative inter-connectivity表征了他们之间邻接区域的大小,其中EC{Ci,Cj}表示跨越i和j的所有连接的强度之和,EC{Ci}表示将cluster i分割为大小接近的两部分所需要切断的连接的强度值和。

Relative Closeness

cluster i和j的relative closeness表征了他们之间近邻连接的强度,其中SEC{Ci,Cj}表示跨越i和j的所有连接的强度平均值,SEC{Ci}表示将cluster i分割为大小接近的两部分所需要切断的连接的强度平均值。

最后,两个cluster之间的距离为

a是用来调节两个参量的比重的参数。

聚类结果

       因为原算法需要使用一些额外的算法来进行图分割,我这里只是使用了一个简化版本的Chameleon算法,使用了绝对的inter-connectivity和closeness,没有对cluster的大小进行normalization(也就是没有考虑上面两条式子中的分母)。

       对样品1进行聚类,分别取聚类数目k=5和8。类似于谱聚类,Chameleon算法也可以稳定地对数据进行聚类,不会对k的选择过分敏感。

       经过多次的调整参数,我也终于把样品2的cluster给识别了出来……

       从算法的角度来说,Chameleon可以用于识别形状特别的cluster,但是实际上调整参数殊为不易(当然这也跟我使用简化版算法有关),而且关键是层次聚类的效率终归不高。所以Chameleon可以在一些特殊的场合使用,个人认为不是一个十分通用的算法。


6、PCCA

      PCCA算法的全称是Perron Cluster Cluster Analysis,名称里有两个cluster是因为这样简写就可以和PCA区分开来(无语……)。PCCA并不是设计来处理传统的聚类问题的,而是专门用于得到马尔科夫链中的cluster。当然,对于一般的聚类问题,只要根据系统特点构造出一个概率转移矩阵,也可以使用PCCA算法。

       要解释马尔科夫模型中的cluster,让我们想象有一只跳蚤在了数据点间跳跃转移。它下一个时刻跳到特定数据点上的概率,只跟它当前落在哪个数据点上有关,这显然是一个经典的马尔可夫过程。再让我们假定,跳蚤在点与点之间的跃迁概率跟数据点的“距离”成反比。如果数据点可以分成几个分界明显的cluster,跳蚤大多数时间就只会在某个cluster内部的数据点间转移,在cluster之间的跳跃则相对罕见。

       先解释一下马尔科夫模型的一些性质。马尔科夫模型需要的是一个转移矩阵A,元素A(i,j)表示系统从状态i转移到状态j的概率。矩阵的每一列元素之和必须为1,这是因为转移概率总和必须为1。转移矩阵有一个本征值为1的本征矢量,对应着系统的稳态,亦即系统到达这个状态后,它在各个状态的概率分布就不会再发生变化。

       为了说明PCCA的原理,我们直接来考虑最为极端的情况,也就是系统由几个完全分离的cluster所构成。对于最为极端的情况,如果系统只能在cluster内部转移,而完全不会在cluster之间转移,那么转移矩阵A就会是分块矩阵的形式,比如下面的系统就可以分为两个完全不连通的cluster,如下面的矩阵。

      这样的一个矩阵存在着不止一个本征值为1的本征矢量,因为它的每个分块都可以看做一个转移矩阵,都会对应着一个稳态。比如对于上面的矩阵A,下面两个本征矢的本征值都为1。

      

      如果我们得到的矢量都是这样的理想形式,那么聚类就很简单了,只要得到本征值为1的全部本征矢,把对应的元素大于0的数据点归为一类就可以。十分可惜的是,由于这两个本征矢量是简并的,它们线性叠加产生的矢量也是矩阵的本征值为1的本征矢量,比如这个矢量:

      因此PCCA算法的思路,就是要从计算得到实际本征矢量,反推得到理想矢量,从而实现聚类。

       如果将计算得到的k个本征值为1的本征列矢量并排合并,成为一个N*k的矩阵,那么矩阵的每一行可以看成对应与数据点的一个坐标。对于理想本征矢(对应下图蓝色基矢),数据点都是落在坐标轴上(因为除了所属的cluster所对应的那个本征值,其余的维度都是0),比如下图的红色和黄色的数据点。但是由于实际得到的本征矢量是理想本征矢的线性叠加,所以基矢就发生了旋转(对应黑色基矢)。

      尽管如此,每个cluster的数据点落在一条直线上的性质并没有发生改变。现在的问题就变成了如何找到这些直线的方向。PCCA首先找到离原点最远的数据点,这个点相对于原点的矢量,就对应了一个理想本征矢。然后每一次都找与已知的理想矢量垂直(相对原点),而又离原点最远的数据点。只要找k次,就能找到所有的理想矢量。最后看数据点落在哪个方向上,就可以知道它们属于哪个cluster。实际情况下,矩阵并不会是完全的分块矩阵,所以除了第一个本征矢,其余本征矢量对应的本征值不会完全为1,而是接近于1。cluster之间的转移几率越小,这个算法的准确性自然越高。

聚类结果

       PCCA算法的一个优点就是,它可以根据本征值来直接得到cluster的数目,有多少个接近于1的本征值就应该分多少个cluster。当然这也是一个限制,聚类数目不能随意给定,完全由数据性质决定,如果cluster的分界不明显,那么可能聚类就完全无效。

       下面是PCCA对样品1的聚类结果。第一幅图是由算法自动判定聚类数目,正好为3,聚类十分成功;第二幅图是人为地要求分为4个cluster,结果算法就基本失效了。

聚类方法

聚类方法

       PCCA是除了Chameleon算法外,对样品2聚类结果最好的一个算法。不过它并不能正确地判断出cluster的数目,总共划分出了7个cluster,这里显示了前5个。

聚类方法

       PCCA可以自动判定cluster数目,而且也能得到非凸型的cluster,还可以适用于概率转移矩阵的聚类,看上去确实是一个性能比较好的聚类算法。不过,PCCA对数据的性质特征有比较强的预设,当数据性质偏离理想状况较远时,算法的稳定性有待考验。

7、SOM

      之所以尝试SOM聚类,主要是因为这是基于神经网络的一种算法,而神经网络本身又是机器学习中的一个重要方法,所以就自己实践一下体会体会。

       所谓SOM指的是Kohonen提出的竞争网络,全称是self-organizing map。这个算法有着非常多的改进和变种,在网络的拓扑结构、节点之间的反馈方式等方面各有不同。更一般地说,SOM应该是一个降维算法,它可以将高维的数据投影到节点平面上,实现高维数据可视化,然后也可以继续根据降维之后的数据再进行聚类,就像谱聚类一样。不过,因为这里仅仅是个人的算法尝试,所以我就使用最简单的方式,直接使用SOM进行聚类。

       竞争网络,顾名思义就是网络节点相互竞争。对于每一个输入的数据点,网络节点都要进行竞争,最后只有一个节点获胜。获胜节点会根据赢得的数据点进行演化,变得与这个数据点更匹配。如果数据可以明显地分为多个cluster,节点变得跟某个cluster内的数据点更为匹配,一般而言就会跟其它cluster不太匹配,这样其它节点就会赢得了其它cluster的数据点。如此反复学习,每个节点就会变得只跟特定的一个cluster匹配,这样就完成了数据点的聚类。

       SOM需要输入数据点的坐标矩阵,对应的,每个网络节点也有一个坐标,初始时刻随机赋值。每次输入一个数据点,与这个数据距离最近的节点获胜,获胜点的坐标向着这个数据点的方向偏移。聪明的看官们肯定发现了,这个简单化的SOM算法跟K-means算法思路基本一致,确实一些文章也提到,在节点数目偏少的情况下SOM的结果就类似于K-means。

聚类结果

       SOM的聚类结果确实跟K-means比较类似,不过当聚类数目取为4时,经常也能正确的结果,而不会聚成4个cluster,这个跟学习时间以及节点的初始值有关。这应该是因为SOM的学习方式与K-means直接求平均不同。至于对样品2的聚类,SOM也跟K-means类似,就不贴出来了。

聚类方法

聚类方法

       这个SOM聚类只是个人试水,并不能真正代表SOM聚类的最佳效果,仅作参考。

8、Affinity Propagation

       Affinity Propagation(简称AP)是一个比较新的算法,在07年发表在Science上面,可见肯定是有一些独到之处的。

       个人认为,AP算法的具体实现步骤没有很直观的物理意义,大致上就是一个网络自动演化的过程,实现起来也并不复杂。感兴趣的童鞋可以直接到算法作者的网页,上面也提供了各个版本的实现程序,可以直接拿来使用。

        

这里我就不详细地叙述算法的实现步骤了,只是介绍一下这个算法的一些特点。

1)AP只要求输入数据点之间相似性矩阵,而且还不需要是对称阵。从这个角度来说,适用范围非常大。

2)AP算法的核心是对于每个cluster找到一个代表数据点exemplar,使得cluster内其它数据点到这个点的距离平方和最小。这是AP算法的一个很大的优点,因为它不仅能完成聚类,还可以给出这个类别的代表。很多时候我们聚类也就是为了找出代表而已。

3)AP算法不能直接知道聚类的数目,它不仅不能判定合适的聚类数目,甚至在聚类完成前,用户都不知道这次会聚出多少个cluster来,只能自己慢慢调整参数,多次尝试……

       AP算法的目标函数跟K-means类似,不过中心点不是平均值,而是真实的一个数据点。其实这个算法可以说是K-centers的一个高效实现,但归根到底得到的也就是K-centers最佳情况下的结果而已,跟K-means也类似,都是大小接近的凸型cluster,所以我就不贴结果了。可以说,当你想得到K-centers的结果时,AP算法是你的最佳选择,但如果你的目标不在于此,那就不要用这个方法了。


       谱聚类聚类的效果比较好,性能也比较稳定。算法需要的输入只是相似矩阵,不需要数据点的坐标矩阵,适用性也较广。一个潜在的问题是,如果数据量很大的话,对大矩阵的对角化可能会导致算法效率低下。但是如果是稀疏矩阵的情况,只计算前k个本征矢量和本征值的效率还是很高的。所以谱聚类算法总体而言是一个不错的选择。


原文地址:http://www.itongji.cn/article/0R52E22013.html
聚类算法汇总 聚类算法汇总标签(空格分隔): 机器学习作为无监督领域(unsupervised)一个太过famous的算法了,聚类(clustering)就是对大量未知标注的数据集,按照数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小. 然而,里面仍然有很多需要注意的地方,对于聚类本身,目前也有很多改进版本了,所以还是需要总结一下的。相似度的度量各种相似度的度量方式及其相关 阅读详情

相关推荐

聚类——基于距离阈值的聚类算法

基于距离阈值的聚类算法 1.最大最小距离算法 算法思想 对待分类模式样本集以最大距离选取新的聚类中心,以最小距离原则进行模式归类。 算法步骤 从N个样本集中的任选取一个样本,作为第一个聚类中心 z1z_1z1​​; 选取距离第一个聚类中心 z1z_1z1​ 最远的样本作为第二个聚类中心 z2z_2z2​; 计算剩余样本与 z1,z2z_1,z_2z1​,z2​之间的距离,并求出他们中的最小值,即: dij=∣∣xi−zj∣∣,  j=1,2  ;      di=min[di1,di2],  i

qq_41536160的博客 5439

对聚类结果和真实标签进行映射的两种思路

对聚类结果和真实标签进行映射的两种思路

weixin_42593155的博客 4364

全网最详细单细胞保姆级分析教程(一) ---pbmc

通过观察热图,可以了解不同细胞在主成分上的分布情况,以及主成分与细胞特征之间的关系。数据归一化是数据分析中的常见步骤,旨在消除数据集中不同特征之间的量纲差异,并使它们在相同的尺度上进行比较。函数会根据指定的主成分维度计算数据点之间的距离,并找到每个数据点的邻居。函数会根据数据点之间的相似性将其分组到不同的聚类中。数据缩放是数据分析中的常见步骤,旨在将数据的特征值调整到相似的范围,以避免某些特征对分析结果的过度影响。通过可视化维度载荷,可以了解哪些特征对主成分的形成起到了重要作用,以及不同特征之间的相关性。

ZxVSaccount的博客 6707

scikitlearn中聚类结果的标签值与原样本数据的对应

1 问题来源 在使用sklearn中的聚类算法过程中,得到的一般为聚类结果的标签值。例如,[1,1,0,1,0,1,0,1,0,1,2,-1,-1,2,3,3,1,-1,-1]这样的标签值,如何将聚类结果的_labels值与原样本对应并打印输出,是亟待解决的问题。 2 源码实现 labels_to_original函数的功能是,将forclusterlist中的样本集按照labels中的标签值重新...

普通攻击往后拉的博客 1万+

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 925

PostGIS 小白入门详细指南

PostGIS 是 PostgreSQL 的一个扩展,它将 PostgreSQL 转变为一个功能强大的空间数据库,使其能够存储、查询和分析地理空间数据。PostGIS 遵循开放地理空间联盟(OGC)的标准,支持各种空间数据类型和操作,如点、线、多边形、缓冲区、空间连接等。存储各种空间数据类型(如几何类型和地理类型)空间索引,提高查询性能丰富的空间函数和操作支持投影和坐标系统转换城市规划与管理环境监测与分析物流与运输优化地图制作与可视化位置服务与导航。

落魄书生的职业学习生涯 1万+

使用聚类(K-means)分析方法对骑手进行分类标签定义

聚类分析的目标就是在相似的基础上收集数据来分类,属于无监督学习。就是通过行为数据,通过算法将相似的人群聚集在一起,形成不带标签的人群簇。再人为的对人群簇进行分析,寻找特征标签。............

q838458640的博客 2594

Java农产品质量溯源大数据管理系统源码

产品追溯基于“一物一码”从工厂生产环节至销售阶段,赋予产品唯一的数码,并关联产品名称、批号、生产时间等信息,建立包装关联关系,为后期产品的追溯、营销搭建信息基础。 农产品溯源,从原材料收购、生产、加工质检到包装运输、终端门店销售等环节追溯,可以保证产品质量,监管部门和消费者都可以查询产品信息。对生产进行层层把关、一旦发现问题、立即进行处理、提升产品质量。

xingchen优快云的博客 1805

kmans将聚类结果标签与原始数据ID对应--记录

Kmeans将聚类结果对原始数据ID 原始数据样式: # K-Means Clustering # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd # Importing the dataset from scipy.cluster.vq import whiten path = 'D:\\data\\cnndata\\order.csv' dataset

zkhong07的博客 6703

二、CANdelaStudio入门-版本介绍

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的各个版本,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YOCANdelaStudio——诊断需求定义工具,诊断协议开发软件 ①用户以模板概念为导向

诊断协议那些事儿's blog 1308

光谱数据预处理综合

除了化学信息,光谱还包含其他不相关或不需要的信息,如电噪声,基质背景,杂散光,散射效应等。在用化学计量学方法建立校准模型时,利用预处理方法消除光谱数据中的无关信息和噪声是非常必要的。

qq_44204759的博客 5191

聚类标签对应数据

做Kmeans时想要把原数据与标签对映起来,不知道有没有类似库,懒得查了,就写了个函数: trainData = ["类0","类1","类2","噪声","类1","类2","类1","类2","类3","类1","类2","类1","噪声","类2","类2","噪声"] label = [0,1,2,-1,1,2,1,2,3,1,2,1,-1,2,2,-1] def label2cluster(trainData, labels): my_dict = {i: [] for i in label

qq_42228788的博客 2090

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

常见聚类算法汇总

正式步入机器学习

振宇的博客 2万+

2025华为od面试手撕代码【求字符串表达式结果】

2025华为od面试手撕代码【求字符串表达式结果】

MISAYAONE的博客 1352

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

各类聚类算法优缺点汇总及python实现

聚类算法汇总 一、方法名字 1.基于质心的算法 K均值算法 K均值算法的优点: 1)是解决聚类问题的一种经典算法,简单、快速 2)对处理大数据集,该算法保持可伸缩性和高效性 3)当簇接近高斯分布时,它的效果较好。 K均值算法的缺点: 1)在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用; 2) 在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事...

weixin_41019798的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

聚类及聚类算法的分类

一、聚类 1、聚类概念 聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。 2、聚类的目标 使同一类对象的相似度尽可能地大;不同类对象之间的相似度尽可能地小。 3、聚类和分类的区别 聚类技术通常又被称为无监督学习,因为与...

count_on_me的博客 7万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

聚类方法汇总

聚类

Mark_Australia的博客 1万+

图像聚类算法

目录一、 分类与聚类1、分类2、聚类聚类样本间的属性聚类的常见算法二、K-Means聚类1、定义、优点2、k-means聚类算法的分析流程:3、K-Means优缺点三、 层次聚类1、定义2、凝聚层次聚类的流程3、层次聚类的优缺点4、示例5、树状图分类判断四、密度聚类1、算法2、优缺点五、谱聚类1、算法步骤 一、 分类与聚类 1、分类   分类其实是从特定的数据中挖掘模式,作出判断的过程。   分类学习主要过程:   (1)训练数据集存在一个类标记号,判断它是正向数据集(起积极作用,不垃圾邮件),还是负向数据

小嵌同学的博客 9142

文本聚类算法总结

一、文本聚类定义 文本聚类主要是依据著名的聚类假设:同类的文档相似度较大,而不同类的文档相似度较小。作为一种无监督的机器学习方法,聚类由于不需要训练过程,以及不需要预先对文档手工标注类别,因此具有一定的灵活性和较高的自动化处理能力,已经成为对文本信息进行有效地组织、摘要和导航的重要手段。 二、算法分类 1、划分法(基于划分的聚类算法) 给定一个有N个元组或者纪录...

哈哈儿 博客 1万+

聚类分析算法整理汇总大集合

开始学习聚类算法,网上查找资料,在这里整合一下。 概念 聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。 算法思想:“物以类聚,人以群分” 如何将数据划分不同类别 通过计算样本之间的相识度,将相识度大的划分为一个类别。衡量样本之间的相识度的大小的方式有下面几种: 1、闵可夫

leiyulu的博客 8042

聚类算法简介

聚类 一.什么是聚类 1.聚类定义 聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小。由这个定义,我们便可以知道,数据集并没有目标值。因此聚类算法属于无监督算法。 2. 相似度的衡量 之前在k-means算法的简介当中,提及过一个欧式距离。但实际上,相似度的衡量方式有很多种。比如说: 欧式距离(这里列出的是欧式距离的拓展,闵可夫斯基距离): 杰卡德相似系数(Jaccard) 余弦相似度: cos⁡(θ)=xTy∣x∣⋅∣

johnny_love_1968的博客 7597

常用的聚类算法及聚类算法评价指标

作者 |荔枝boy来源 |磐创AI引用 | 基于图的聚类分析研究—张涛【导读】:本文介绍了常用的聚类算法及聚类算法评价指标。1. 典型聚类算法1.1 基于划分的方法代表:kmeans算...

Python数据之道 7955

【聚类算法】基于网格的聚类

网格聚类算法是一种将数据空间划分为有限数量的单元,形成一个网格结构的数据结构,然后在此基础上进行聚类的方法。这种算法的主要思想是将数据空间划分为有限个单元组成的网格,每个单元代表一个区域,然后对每个单元进行统计,根据统计结果来确定哪些单元属于同一个簇。

大雨淅淅的博客 3183

用Python实现的10种聚类算法汇总

聚类是一种无监督学习问题。它经常用来在输入数据的特征空间中寻找分组,例如基于顾客行为将消费者分组。聚类算法有很多种,没有哪一种聚类算法适用于所有的问题。不过,有必要去探究多种聚类算法,以及每种算法的不同配置,这样在遇到问题时才能做出合适的选择。在本文中,你将会了解如何选择合适的聚类算法,并且使用python和scikit-learn去实现它们。

分享Python、数据分析、人工智能前沿知识 1713
上一篇: 层次聚类--凝聚(自底向上)和分裂(自顶向下)
下一篇: Python学习之set()集合
resourse_sharing
博客等级 码龄18年 54粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值