聚类算法学习

近期对聚类算法进行了学习,参考博客列举如下:

  1. 常见的六大聚类算法: https://blog.csdn.net/Katherine_hsr/article/details/79382249
  2. 数据科学家必须了解的六大聚类算法:带你发现数据之美 https://www.jiqizhixin.com/articles/the-6-clustering-algorithms-data-scientists-need-to-know
  3. 简单易学的机器学习算法——Mean Shift聚类算法:https://blog.csdn.net/google19890102/article/details/51030884#commentBox
  4. 机器学习(十)Mean Shift 聚类算法: https://blog.csdn.net/hjimce/article/details/45718593(流程清晰易懂,包含多个聚类的流程)
  5. DBSCAN密度聚类算法: https://www.cnblogs.com/pinard/p/6208966.html
  6. 漫谈 Clustering (3): Gaussian Mixture Model:http://blog.pluskid.org/?p=39&cpage=1#comments
    (很好的一篇讲GMM的文章,该系列都很赞,强烈推荐!)
  7. (EM算法)The EM Algorithm:https://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html

聚类算法主要有:

  • K-means(K均值聚类、一种变体为K-medians)
  • 均值漂移(Mean Shift算法)
  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)
  • GMM(高斯混合模型聚类)
  • HAC(凝聚层级聚类)
  • 图团体检测(Graph Community Detection)

1. K-means

K-means聚类,即K均值聚类,思想比较简单:先随机选定K个聚类中心,计算每个数据点到K个聚类中心的距离,将该数据点归到距离最近的那一类当中。所有数据点都完成分类后 ,计算每一类中数据点的平均值作为新的K个聚类中心,重复之前的聚类操作,直到达到迭代次数阈值或者聚类中心位置变化小于阈值,得到 最终聚类结果。

优点:速度快,计算简便
缺点:我们必须提前知道数据有多少类/组。

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

2. 均值漂移

均值漂移(Mean Shift)算法,是一个迭代的步骤,即先算出当前点的偏移均值,将该点移动到此偏移均值,然后以此为新的起始点,继续移动,直到满足最终的条件。

均值漂移(Mean Shift)算法最早是由Fukunage在1975年提出的,在后来由Yizong Cheng对其进行扩充,主要提出了两点的改进:

  • 定义了核函数
  • 增加了权重系数

核函数的定义使得偏移值对偏移向量的贡献随之样本与被偏移点的距离的不同而不同。权重系数使得不同样本的权重不同。Mean Shift算法在聚类,图像平滑、分割以及视频跟踪等方面有广泛的应用。

算法流程如下:

假设在一个多维空间中有很多数据点需要进行聚类,Mean Shift的过程如下:

1、在未被标记的数据点中随机选择一个点作为中心center;

2、找出离center距离在bandwidth之内的所有点,记做集合M,认为这些点属于簇c。同时,把这些求内点属于这个类的概率加1,这个参数将用于最后步骤的分类

3、以center为中心点,计算从center开始到集合M中每个元素的向量,将这些向量相加,得到向量shift。

4、center = center+shift。即center沿着shift的方向移动,移动距离是||shift||。

5、重复步骤2、3、4,直到shift的大小很小(就是迭代到收敛),记住此时的center。注意,这个迭代过程中遇到的点都应该归类到簇c。

6、如果收敛时当前簇c的center与其它已经存在的簇c2中心的距离小于阈值,那么把c2和c合并。否则,把c作为新的聚类,增加1类。

6、重复1、2、3、4、5直到所有的点都被标记访问。

7、分类:根据每个类,对每个点的访问频率,取访问频率最大的那个类,作为当前点集的所属类。

简单的说,mean shift就是沿着密度上升的方向寻找同属一个簇的数据点。

优点:不需要我们知道有多少类/组。
缺点:窗口半径r的选择可能是不重要的。

3. DBSCAN

**DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)**是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。

参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。其中,ϵ描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。

有一些关于DBSCAN的名词解释如下:

假设我的样本集是D=(x1,x2,…,xm),则DBSCAN具体的密度描述定义如下:

1) ϵ-邻域:对于xj∈D,其ϵ-邻域包含样本集D中与xj的距离不大于ϵ的子样本集,即Nϵ(xj)={xi∈D|distance(xi,xj)≤ϵ}, 这个子样本集的个数记为|Nϵ(xj)|

2) 核心对象:对于任一样本xj∈D,如果其ϵ-邻域对应的Nϵ(xj)至少包含MinPts个样本,即如果|Nϵ(xj)|≥MinPts,则xj是核心对象。

3)密度直达:如果xi位于xj的ϵ-邻域中,且xj是核心对象,则称xi由xj密度直达。注意反之不一定成立,即此时不能说xj由xi密度直达, 除非且xi也是核心对象。

4)密度可达:对于xi和xj,如果存在样本样本序列p1,p2,…,pT,满足p1=xi,pT=xj, 且pt+1由pt密度直达,则称xj由xi密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本p1,p2,…,pT−1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。

5)密度相连:对于xi和xj,如果存在核心对象样本xk,使xi和xj均由xk密度可达,则称xi和xj密度相连。注意密度相连关系是满足对称性的。

某些样本可能到两个核心对象的距离都小于ϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说DBSCAN的算法不是完全稳定的算法

算法流程总结如下

输入:样本集D=(x1,x2,…,xm),邻域参数(ϵ,MinPts), 样本距离度量方式
输出: 簇划分C. 
1)初始化核心对象集合Ω=∅, 初始化聚类簇数k=0,初始化未访问样本集合Γ = D, 簇划分C = ∅
2) 对于j=1,2,…m, 按下面的步骤找出所有的核心对象:
  a) 通过距离度量方式,找到样本xj的ϵ-邻域子样本集Nϵ(xj)
  b) 如果子样本集样本个数满足|Nϵ(xj)|≥MinPts, 将样本xj加入核心对象样本集合:Ω=Ω∪{xj}
3)如果核心对象集合Ω=∅,则算法结束,否则转入步骤4.
4)在核心对象集合Ω中,随机选择一个核心对象o,初始化当前簇核心对象队列Ωcur={o}, 初始化类别序号k=k+1,初始化当前簇样本集合Ck={o}, 更新未访问样本集合Γ=Γ−{o}
5)如果当前簇核心对象队列Ωcur=∅,则当前聚类簇Ck生成完毕, 更新簇划分C={C1,C2,…,Ck}, 更新核心对象集合Ω=Ω−Ck, 转入步骤3。否则更新核心对象集合Ω=Ω−Ck。
6)在当前簇核心对象队列Ωcur中取出一个核心对象o′,通过邻域距离阈值ϵ找出所有的ϵ-邻域子样本集Nϵ(o′),令Δ=Nϵ(o′)∩Γ,更新当前簇样本集合Ck=Ck∪Δ, 更新未访问样本集合Γ=Γ−Δ, 更新Ωcur=Ωcur∪(Δ∩Ω)−o′,转入步骤5.

输出结果为: 簇划分C={C1,C2,…,Ck}

DBSCAN的主要优点有:

1)不需要输入类别数k
2)当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类
3)可以对任意形状的稠密数据集进行聚类
4) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
5) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

DBSCAN的主要缺点有:

1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响

4 GMM(高斯混合模型聚类)

可以参考这篇博文:漫谈 Clustering (3): Gaussian Mixture Model
http://blog.pluskid.org/?p=39&cpage=1#comments

使用 GMMs 有两个关键的优势。

1)GMMs 比 K-Means 在簇协方差方面更灵活;因为标准差参数,簇可以呈现任何椭圆形状,而不是被限制为圆形。K-Means 实际上是 GMM 的一个特殊情况,这种情况下每个簇的协方差在所有维度都接近 0。

2)因为 GMMs 使用概率,所以每个数据点可以有很多簇。因此如果一个数据点在两个重叠的簇的中间,我们可以简单地通过说它百分之 X 属于类 1,百分之 Y 属于类 2 来定义它的类。即 GMMs 支持混合资格。

注意:GMM和K_Means一样都是局部最优方法,跟初值的选取有关,初值选择不当可能会得到较差的结果。
K_means由于计算简单,可以多做几次然后选择最好的那一次结果。
GMM计算量较大,有博客提到,可以先使用k_means作为初值。

5 HAC(凝聚层级聚类)

层次聚类算法实际上分为两类:自上而下或自下而上。自下而上的算法首先将每个数据点视为一个单一的簇,然后连续地合并(或聚合)两个簇,直到所有的簇都合并成一个包含所有数据点的簇。因此,自下而上层次聚类被称为凝聚式层次聚类或 HAC。

  1. 我们首先将每个数据点视为一个单一的簇,即如果我们的数据集中有 X 个数据点,那么我们就有 X
    个簇。然后,我们选择一个测量两个簇之间距离的距离度量标准。作为例子,我们将用 average
    linkage,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离。

  2. 在每次迭代中,我们将两个簇合并成一个。这两个要合并的簇应具有最小的 average
    linkage。即根据我们选择的距离度量标准,这两个簇之间的距离最小,因此是最相似的,应该合并在一起。

  3. 重复步骤 2,直到我们到达树根,即我们只有一个包含所有数据点的簇。这样我们只需要选择何时停止合并簇,即何时停止构建树,来选择最终需要多少个簇!

凝聚层级聚类优缺点
优点:
1)不需要我们指定簇的数量,我们甚至可以选择哪个数量的簇看起来最好,因为我们正在构建一棵树。
2)该算法对于距离度量标准的选择并不敏感;他们都同样表现很好,而对于其他聚类算法,距离度量标准的选择是至关重要的。
缺点:
1)与 K-Means 和 GMM 的线性复杂度不同,层次聚类的这些优点是以较低的效率为代价的,因为它具有 O(n³) 的时间复杂度。

6 图团体检测(Graph Community Detection)

https://www.cnblogs.com/jerrylead/archive/2012/05/08/2489725.html

你可能感兴趣的:(机器学习,聚类)