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

开始学习聚类算法,网上查找资料,在这里整合一下。

概念

聚类分析算法整理汇总大集合_第1张图片
聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。

算法思想:“物以类聚,人以群分”

如何将数据划分不同类别
通过计算样本之间的相识度,将相识度大的划分为一个类别。衡量样本之间的相识度的大小的方式有下面几种:

1、闵可夫斯基距离(Minkowski距离)也就是前面提到的范式距离
当p=1时为曼哈顿距离,公式如下(以二维空间为例):
在这里插入图片描述
聚类分析算法整理汇总大集合_第2张图片
当p=2时,为欧几里得距离,公式如下:
在这里插入图片描述
当p=为无穷大时候,为切比雪夫距离,公式如下:
在这里插入图片描述
一般情况下用欧几里得距离比较多,当数据量出现扁平化时候,一般用切夫雪比距离。

2、夹角余弦相识度
假设两个样本有2个特征,
则这两个样本的夹角余弦相似度公式如下:
在这里插入图片描述

最常见的应用就是计算文本相似度。将两个文本根据他们词,建立两个向量,计算这两个向量的余弦值,就可以知道两个文本在统计学方法中他们的相似度情况。实践证明,这是一个非常有效的方法。

3、杰卡德相似系数(Jaccard)
适用于样本只有(0,1)的情况,又叫二元相似性,计算公式如下:
在这里插入图片描述

将杰卡德相似性度量应用到基于物品的协同过滤系统中,并建立起相应的评价分析方法。 与传统相似性度量方法相比,杰卡德方法完善了余弦相似性只考虑用户评分而忽略了其他信息量的弊端,特别适合于应用到稀疏度过高的数据。

类别的定义:簇
前面我们讲到把数据划分为不同类别,机器学习给这个类别定义一个新的名字—簇。
将具有M个样本的数据换分为k个簇,必然k<=M。簇满足以下条件:
每个簇至少包含一个对象
每个对象属于且仅属于一个簇
将上述条件的k个簇成为一个合理的聚类划分
对于给定的类别数目k,首先给定初始划分,通过迭代改变样本和簇的隶属关系,使的每次处理后得到的划分方式比上一次的好(总的数据集之间的距离和变小了)。

一、K-Means(K均值)聚类

聚类分析算法整理汇总大集合_第3张图片

算法步骤:
(1) 首先我们选择一些簇,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置。这需要我们提前预知簇的数量(即中心点的数量n)。
(2)每个数据点通过计算点和每个簇中心之间的距离进行分类,然后将这个点分类为最接近它的簇。(可选欧几里得距离)
(3) 基于这些分类点,将样本分为n个簇,通过取簇中所有向量的均值来重新计算簇中心。
(4) 重复以上步骤,直到每一类中心在每次迭代后变化不大为止。也可以多次随机初始化中心点,然后选择运行结果最好的一个。
聚类分析算法整理汇总大集合_第4张图片
K-Means的损失函数
聚类分析算法整理汇总大集合_第5张图片

缺点:

(1)必须选择有多少簇。K-Means也从随机选择的聚类中心开始,因此在不同的算法运行中可能产生不同的聚类结果。因此,结果可能是不可重复的,并且缺乏一致性。
(2)K- means算法在迭代的过程中使用所有点的均值作为新的质点(中心点),如果簇中存在异常点,将导致均值偏差比较严重。

延申:

K-Medians
是K-Means的一种变体,是用数据集的中位数而不是均值来计算数据的中心点。
K-Medians的优势是使用中位数来计算中心点不受异常值的影响;缺点是计算中位数时需要对数据集中的数据进行排序,速度相对于K-Means较慢。

K-Means++
K-Means++算法在聚类中心的初始化过程中的基本原则是使得初始的聚类中心之间的相互距离尽可能远,这样可以避免出现上述的问题。从而可以解决K- Means算法对初始簇心比较敏感的问题,K- Means++算法和K- Means算法的区别主要在于初始的K个中心点的选择方面。

K- Means算法使用随机给定的方式,K- Means++算法采用下列步骤给定K个初始质点:

  1. 从数据集中任选一个节点作为第一个聚类中心
  2. 对数据集中的每个点ⅹ,计算x到所有已有聚类中心点的距离和D(X),基于D(X)采用线性概率(每个样本被选为下一个中心点的概率)选择出下一个聚类中心点距离较远的一个点成为新增的一个聚类中心点)
  3. 重复步骤2直到找到k个聚类中心点

这种由于依靠中心点和中心点之间的有序性进行中心点的划分,虽然避免了初始值敏感问题,可对于特别离散的数据,效果就不是很好了。

二分K- Means算法
同样是为了解决K- Means算法对初始簇心比较敏感的问题,二分K- Means算法和前面两种寻找其他质心不同,它是一种弱化初始质心的一种算法。

这个算法的思想是:
首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇(或者选择最大的簇等,选择方法多种)。以此进行下去,直到簇的数目等于用户给定的数目k为止。

算法的步骤如下:

  1. 将所有样本数据作为一个簇放到一个队列中 从队列中选择一个簇进行K- means算法划分,划分为两个子簇,并将子簇添加到队列中
  2. 循环迭代第二步操作,直到中止条件达到(聚簇数量、最小平方误差、迭代次数等) 队列中的簇就是最终的分类簇集合

从队列中选择划分聚簇的规则一般有两种方式,分别如下:

  1. 对所有簇计算误差和SSE(SSE也可以认为是距离函数的一种变种),选择SSE最大的聚簇进行划分操作(优选这种策略)
    在这里插入图片描述

  2. 选择样本数据量最多的簇进行划分操作

Canopy算法
Canopy Clustering 这个算法是2000年提出来的,此后与Hadoop配合,已经成为一个比较流行的算法了。确切的说,这个算法获得的并不是最终结果,它是为其他算法服务的,比如k-means算法。它能有效地降低k-means算法中计算点之间距离的复杂度。

算法流程如下:

  1. 给定样本列表L=x1,2…,m以及先验值T1和T2(T1>T2)
  2. 从列表L中获取一个节点P,计算P到所有聚簇中心点的距离(如果不存在聚簇中心,那么此时点P形成一个新的聚簇),并选择出最小距离D(P,aj)。
  3. 如果距离D小于T1,表示该节点属于该聚簇,添加到该聚簇列表中
  4. 如果距离D小于T2,表示该节点不仅仅属于该聚簇,还表示和当前聚簇中心点非常近,所以将该聚簇的中心点设置为该簇中所有样本的中心点,并将P从列表L中删除。
  5. 如果距离D大于T1,那么节点P形成一个新的聚簇。
  6. 直到列表L中的元素数据不再有变化或者元素数量为0的时候,结束循环操作。

该步骤用流程图表示如下图所示:
聚类分析算法整理汇总大集合_第6张图片
Canopy算法得到的最终结果的值,聚簇之间是可能存在重叠的,但是不会存在某个对象不属于任何聚簇的情况。

可以看到canopy算法将可以将一堆杂乱的数据大致的划分为几块所以Canopy算法一般会和kmeans算法配合使用来到达使用者的目的在使用Canopy算法时,阈值t1,t2的确定是十分重要的。t1的值过大,会导致更多的数据会被重复迭代,形成过多的Canopy;值过小则导致相反的效果t2的值过大,会导致一个canopy中的数据太多,反之则过少。这样的情况都会导致运行的结果不准确。

该算法的过程图形说明如图所示:
聚类分析算法整理汇总大集合_第7张图片
Mini batch k- Means算法
Mini Batch K-Means使用了一个种叫做Mini Batch(分批处理)的方法对数据点之间的距离进行计算。Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。由于计算样本量少,所以会相应的减少运行时间,但另一方面抽样也必然会带来准确度的下降。这样使用于存在巨大的数据集合的情况下。
实际上,这种思路不仅应用于K-Means聚类,还广泛应用于梯度下降、深度网络等机器学习和深度学习算法。

该算法的算法流程和k- Means类似,流程如下:

(1)首先抽取部分数据集,使用K- Means算法构建出K个聚簇点的模型。
(2)继续抽取训练数据集中的部分数据集样本数据,并将其添加到模型中,分配给距离最近的聚簇中心点。
(3)更新聚簇的中心点值。
(4)循环迭代第二步和第三步操作,直到中心点稳定或者达到迭代次数,停止计算操作。
应用场景,由于Mini Batch KMeans跟K-Means是极其相似的两种聚类算法,因此应用场景基本一致。

二、均值偏移聚类算法

均值偏移(Mean shift)聚类算法是一种基于滑动窗口(sliding-window)的算法,来找到数据点的密集区域。这是一个基于质心的算法,通过将中心点的候选点更新为滑动窗口内点的均值来完成,来定位每个组/类的中心点。这些候选窗口在后期处理阶段被过滤,以消除几乎重复的部分,形成最后一组中心点及其对应的组。
聚类分析算法整理汇总大集合_第8张图片
单滑动窗口的均值偏移聚类

具体步骤:

  1. 确定滑动窗口半径r,以随机选取的中心点C半径为r的圆形滑动窗口开始滑动。均值漂移类似一种爬山算法,在每一次迭代中向密度更高的区域移动,直到收敛。
  2. 每一次滑动到新的区域,计算滑动窗口内的均值来作为中心点,滑动窗口内的点的数量为窗口内的密度。在每一次移动中,窗口会向密度更高的区域移动。
  3. 移动窗口,计算窗口内的中心点以及窗口内的密度,知道没有方向在窗口内可以容纳更多的点,即一直移动到圆内密度不再增加为止。
  4. 步骤一到三会产生很多个滑动窗口,当多个滑动窗口重叠时,保留包含最多点的窗口,然后根据数据点所在的滑动窗口进行聚类。

下面展示了从端到端所有滑动窗口的整个过程的演示。每个黑点代表一个滑动窗口的质心,每个灰色点都是一个数据点:
聚类分析算法整理汇总大集合_第9张图片
优点:
(1)不同于K-Means算法,均值漂移聚类算法不需要我们知道有多少类/组。
(2)基于密度的算法相比于K-Means受均值影响较小。

缺点:
选择窗口大小/半径r是非常关键的,所以不能疏忽。

三、基于密度的聚类方法(DBSCAN)

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法,类似于均值转移聚类算法,但它有几个显著的优点。

具体步骤:

  1. DBSCAN以一个从未访问过的任意起始数据点开始。这个点的邻域是用距离ε(所有在ε距离的点都是邻点)来提取的。
  2. 首先确定半径r和minPoints. 从一个没有被访问过的任意数据点开始,以这个点为中心,r为半径的圆内包含的点的数量是否大于或等于minPoints,如果大于或等于minPoints则改点被标记为central point,反之则会被标记为noise point。
  3. 重复1的步骤,如果一个noise point存在于某个central point为半径的圆内,则这个点被标记为边缘点,反之仍为noise point。重复步骤1,直到所有的点都被访问(visited)过。
  4. 一旦我们完成了当前的聚类,就会检索并处理一个新的未访问点,这将导致进一步的聚类或噪声的发现。这个过程不断地重复,直到所有的点被标记为访问。因为在所有的点都被访问过之后,每一个点都被标记为属于一个聚类或者是噪音。

    DBSCAN笑脸聚类

优点:
(1)不需要知道簇的数量
(2)它还将异常值识别为噪声,而不像均值偏移聚类算法,即使数据点非常不同,它也会将它们放入一个聚类中。
(3)它还能很好地找到任意大小和任意形状的聚类。

缺点:
(1)需要确定距离r和minPoints
(2)当聚类具有不同的密度时,它的性能不像其他聚类算法那样好。这是因为当密度变化时,距离阈值ε和识别邻近点的minPoints的设置会随着聚类的不同而变化。这种缺点也会出现在非常高维的数据中,因为距离阈值ε变得难以估计。

四、用高斯混合模型(GMM)的最大期望(EM)聚类

K-Means的缺点在于对聚类中心均值的简单使用。下面的图中的两个圆如果使用K-Means则不能作出正确的类的判断。同样的,如果数据集中的点类似下图中曲线的情况也是不能正确分类的。
聚类分析算法整理汇总大集合_第10张图片
使用高斯混合模型(GMM)做聚类首先假设数据点是呈高斯分布的,相对应K-Means假设数据点是圆形的,高斯分布(椭圆形)给出了更多的可能性。我们有两个参数来描述簇的形状:均值和标准差。所以这些簇可以采取任何形状的椭圆形,因为在x,y方向上都有标准差。因此,每个高斯分布被分配给单个簇。
所以要做聚类首先应该找到数据集的均值和标准差,我们将采用一个叫做最大期望(EM)的优化算法。下图演示了使用高斯混合模型进行最大期望的聚类过程。
聚类分析算法整理汇总大集合_第11张图片

具体步骤:

  1. 选择簇的数量(与K-Means类似)并随机初始化每个簇的高斯分布参数(均值和方差)。也可以先观察数据给出一个相对精确的均值和方差。
  2. 给定每个簇的高斯分布,计算每个数据点属于每个簇的概率。一个点越靠近高斯分布的中心就越可能属于该簇。
  3. 基于这些概率我们计算高斯分布参数使得数据点的概率最大化,可以使用数据点概率的加权来计算这些新的参数,权重就是数据点属于该簇的概率。
  4. 重复迭代2和3直到在迭代中的变化不大。

优点:
(1)GMMs使用均值和标准差,簇可以呈现出椭圆形而不是仅仅限制于圆形。K-Means是GMMs的一个特殊情况,是协方差在每个聚类所有维度上都接近于0时簇就会呈现出圆形。
(2)GMMs是使用概率,所有一个数据点可以属于多个簇。例如,如果一个数据点位于两个重叠的聚类的中间,通过说X%属于1类,而y%属于2类。也就是说GMMs可以支持混合资格。

五、层次聚类算法

分为两类:自上而下和自下而上。凝聚层级聚类(HAC)(合成聚类)是自下而上的一种聚类算法。HAC首先将每个数据点视为一个单一的簇,然后计算所有簇之间的距离来合并簇,知道所有的簇聚合成为一个簇为止。
因此,聚类的层次结构用一棵树(或树状图)表示。树的根是收集所有样本的唯一聚类,而叶子是只有一个样本的聚类。

下图为凝聚层级聚类的一个实例:

聚类分析算法整理汇总大集合_第12张图片凝聚层级聚类

具体步骤:

  1. 首先我们将每个数据点视为一个单一的簇,然后选择一个测量两个簇之间距离的度量标准。例如我们使用平均连接(average linkage)聚类作为标准,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离。
  2. 在每次迭代中,我们将两个具有最小average linkage的簇合并成为一个簇。比如说根据我们选择的距离度量,这两个聚类之间的距离最小,因此是最相似的,应该组合在一起。
  3. 重复步骤2知道所有的数据点合并成一个簇(直到到达树的根),我们只有一个包含所有数据点的聚类。然后选择我们需要多少个簇,只需选择何时停止合并聚类,也就是停止建造这棵树的时候。

优点:
(1)不需要知道有多少个簇
(2)对于距离度量标准的选择并不敏感
层次聚类方法的一个特别好的用例是,当底层数据具有层次结构时,你可以恢复层次结构;而其他的聚类算法无法做到这一点。

缺点:
效率低,具有O(n³)的时间复杂度

六、图团体检测(Graph Community Detection)

当我们的数据可以被表示为网络或图是,可以使用图团体检测方法完成聚类。在这个算法中图团体(graph community)通常被定义为一种顶点(vertice)的子集,其中的顶点相对于网络的其他部分要连接的更加紧密。下图展示了一个简单的图,展示了最近浏览过的8个网站,根据他们的维基百科页面中的链接进行了连接。聚类分析算法整理汇总大集合_第13张图片
模块性可以使用以下公式进行计算:
在这里插入图片描述

其中L代表网络中边的数量,Aij 代表真实的顶点i和j之间的边数, ki,kj 代表每个顶点的degree,可以通过将每一行每一列的项相加起来而得到。两者相乘再除以 2L 表示该网络是随机分配的时候顶点i和j之间的预期边数。所以 Aij−kikj2L 代表了该网络的真实结构和随机组合时的预期结构之间的差。**当 Aij 为1时,且 kikj2L 很小的时候,其返回值最高。**也就是说,当在定点i和j之间存在一个非预期边时得到的值更高。

聚类分析算法整理汇总大集合_第14张图片
通过上述公式可以计算图的模块性,且模块性越高,该网络聚类成不同团体的程度越好,因此通过最优化方法寻找最大模块性就能发现聚类该网络的最佳方法。

组合学告诉我们对于一个仅有8个顶点的网络,就存在4140种不同的聚类方式,16个顶点的网络的聚类方式将超过100亿种。32个顶点的网络的可能聚类方式更是将超过10^21种。因此,我们必须寻找一种启发式的方法使其不需要尝试每一种可能性。这种方法叫做Fast-Greedy Modularity-Maximization(快速贪婪模块性最大化)的算法,这种算法在一定程度上类似于上面描述的集聚层次聚类算法。只是这种算法不根据距离来融合团体,而是根据模块性的改变来对团体进行融合。

具体步骤:

  1. 首先初始分配每个顶点到其自己的团体,然后计算整个网络的模块性 M。
  2. 第 1 步要求每个团体对(community pair)至少被一条单边链接,如果有两个团体融合到了一起,该算法就计算由此造成的模块性改变 ΔM。
  3. 第 2 步是取 ΔM 出现了最大增长的团体对,然后融合。然后为这个聚类计算新的模块性 M,并记录下来。
  4. 重复第 1 步和 第 2 步——每一次都融合团体对,这样最后得到 ΔM 的最大增益,然后记录新的聚类模式及其相应的模块性分数 M。
  5. 重复第 1 步和 第 2 步——每一次都融合团体对,这样最后得到 ΔM 的最大增益,然后记录新的聚类模式及其相应的模块性分数 M。

原文链接:
https://towardsdatascience.com/the-5-clustering-algorithms-data-scientists-need-to-know-a36d136ef68
感谢参考:
https://www.jianshu.com/p/2fa67f9bad60
https://blog.csdn.net/Katherine_hsr/article/details/79382249?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai
https://blog.csdn.net/u011511601/article/details/81951939

对于不知道聚类个数的数据一般用什么方法:
二分kmeans或者多簇数观察聚类好坏

你可能感兴趣的:(算法)