聚类算法

4 篇文章 0 订阅

常见聚类算法小结

参考:https://blog.csdn.net/abcjennifer/article/details/8170687?utm_source=blogxgwz1
https://www.zhihu.com/search?q=聚类算法&type=content

1、K-Means

K-Means(k-平均或k-均值)可以称的上是知名度最高的一种聚类算法,它常出现在许多有关数据科学和机器学习的课程中。在代码中非常容易理解和实现!让我们来看下面这幅动图。

img

K-Means聚类步骤

  1. 首先,我们确定要几个的聚类(cluster,也称簇),并为它们随机初始化一个各自的聚类质心点(cluster centroids),它在上图中被表示为“X”。要确定聚类的数量,我们可以先快速看一看已有的数据点,并从中分辨出一些独特的数据。
  2. 其次,我们计算每个数据点到质心的距离来进行分类,它跟哪个聚类的质心更近,它就被分类到该聚类。
  3. 需要注意的是,初始质心并不是真正的质心,质心应满足聚类里每个点到它的欧式距离平方和最小这个条件。因此根据这些被初步分类完毕的数据点,我们再重新计算每一聚类中所有向量的平均值,并确定出新的质心。
  4. 最后,重复上述步骤,进行一定次数的迭代,直到质心的位置不再发生太大变化。当然你也可以在第一步时多初始化几次,然后选取一个看起来更合理的点节约时间。

K-Means的优点是速度非常快,因为我们所做的只是计算数据点和质心点之间的距离,涉及到的计算量非常少!因此它的算法时间复杂度只有 O ( n k t ) O(nkt) O(nkt)。n是对象个数,k是簇的个数,t是迭代次数。

另一方面,K-Means有以下几个缺点:

一是你必须一开始就决定数据集中包含多少个聚类。这个缺点并不总是微不足道的,理想情况下,我们的目标其实是用一种算法来分类这些数据,并从结果中观察出一些规律,而不是限制几个条件强行聚类。
二是对初值敏感,一开始质心点的选取是随机的,算法可能会初始化出差异巨大的点。这个缺点导致的结果是质心点的位置不可重复且缺乏一致性。
三是不适合非凸面形的簇,或大小差异很大的簇。
四是对噪声或孤立点敏感。

K-Medians是与K-Means相关的另一种聚类算法,不同之处在于它使用簇的中值向量来重新计算质心点。该方法对异常值不敏感(因为使用中值),但在较大数据集上运行时速度会慢很多,因为每次计算中值向量,我们都要重新排序。

2、Mean-Shift聚类(基于密度)

https://blog.csdn.net/google19890102/article/details/51030884
https://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html

2.1 MeanShift推导

给定d维空间 R d R^d Rd的n个样本点 x i x_i xi , i = 1 , … , n i=1,…,n i=1,,n,在空间中任选一点x,那么Mean Shift向量的基本形式定义为:

M h ( x ) = 1 k ∑ x i ∈ S k ( x i − x ) M_h\left ( x \right )=\dfrac{1}{k}\sum_{x_i\in S_k}\left ( x_i-x \right ) Mh(x)=k1xiSk(xix)

S k S_k Sk是一个半径为h的高维球区域,满足以下关系的y点的集合,

S h ( x ) = ( y ∣ ( y − x ) ( y − x ) T ⩽ h 2 ) S_h\left ( x \right )=\left ( y\mid \left ( y-x \right )\left ( y-x \right )^T\leqslant h^2 \right ) Sh(x)=(y(yx)(yx)Th2)

k表示在这n个样本点 x i x_i xi中,有k个点落入 S h S_h Sh区域中.

在d维空间中,任选一个点,然后以这个点为圆心,h为半径做一个高维球,因为有d维,d可能大于2,所以是高维球。落在这个球内的所有点和圆心都会产生一个向量,向量是以圆心为起点落在球内的点位终点。然后把这些向量都相加。相加的结果就是Meanshift向量。

如图所以。其中黄色箭头就是 M h M_h Mh(meanshift向量)。
在这里插入图片描述

再以meanshift向量的终点为圆心,再做一个高维的球。如下图所以,重复以上步骤,就可得到一个meanshift向量。如此重复下去,meanshift算法可以收敛到概率密度最大得地方。也就是最稠密的地方。

在这里插入图片描述

最终的结果如下:

在这里插入图片描述

这样的一种基本的Mean Shift形式存在一个问题:在 S h S_h Sh的区域内,每一个点对 x x x的贡献是一样的。而实际上,这种贡献与 x x x到每一个点之间的距离是相关的。同时,对于每一个样本,其重要程度也是不一样的。

2.2改进的Mean Shift向量形式

基于以上的考虑,对基本的Mean Shift向量形式中增加核函数和样本权重,得到如下的改进的Mean Shift向量形式:

M h ( x ) = ∑ i = 1 n G H ( x i − x ) w ( x i ) ( x i − x ) ∑ i = 1 n G H ( x i − x ) w ( x i ) M_h\left ( x \right )=\dfrac{\sum_{i=1}^{n}G_H\left ( x_i-x \right )w\left ( x_i \right )\left ( x_i-x \right )}{\sum_{i=1}^{n}G_H\left ( x_i-x \right )w\left ( x_i \right )} Mh(x)=i=1nGH(xix)w(xi)i=1nGH(xix)w(xi)(xix)

其中:

G H ( x i − x ) = ∣ H ∣ − 1 2 G ( H − 1 2 ( x i − x ) ) G_H\left ( x_i-x \right )=\left | H \right |^{-\frac{1}{2}}G\left ( H^{-\frac{1}{2}}\left ( x_i-x \right ) \right ) GH(xix)=H21G(H21(xix))

G ( x ) G(x) G(x)是一个单位的核函数。 H H H是一个正定的对称 d × d d×d d×d矩阵,称为带宽矩阵,其是一个对角阵。 w ( x i ) ⩾ 0 w(x_i)⩾0 w(xi)0是每一个样本的权重。对角阵 H H H的形式为:

H = ( h 1 2 0 ⋯ 0 0 h 2 2 ⋯ 0 ⋮ ⋮ ⋮ 0 0 ⋯ h d 2 ) d × d H=\begin{pmatrix}h_1^2 & 0 & \cdots & 0\\ 0 & h_2^2 & \cdots & 0\\ \vdots & \vdots & & \vdots \\ 0 & 0 & \cdots & h_d^2\end{pmatrix}_{d\times d} H=h12000h22000hd2d×d

上述的Mean Shift向量可以改写成:

M h ( x ) = ∑ i = 1 n G ( x i − x h i ) w ( x i ) ( x i − x ) ∑ i = 1 n G ( x i − x h i ) w ( x i ) M_h\left ( x \right )=\dfrac{\sum_{i=1}^{n}G\left ( \frac{x_i-x}{h_i} \right )w\left ( x_i \right )\left ( x_i-x \right )}{\sum_{i=1}^{n}G\left ( \frac{x_i-x}{h_i} \right )w\left ( x_i \right )} Mh(x)=i=1nG(hixix)w(xi)i=1nG(hixix)w(xi)(xix)

Mean Shift向量 M h ( x ) M_h(x) Mh(x)是归一化的概率密度梯度。

过程如下:

在这里插入图片描述
Mean shift算法事实上存在多个圆形区域,图中黑点代表质心,而灰点则是数据点。

在这里插入图片描述

和K-Means算法相比,Mean-Shift不需要实现定义聚类数量,因为这些都可以在计算偏移均值时得出。这是一个巨大的优势。同时,算法推动聚类中心在向密度最大区域靠近的效果也非常令人满意,这一过程符合数据驱动型任务的需要,而且十分自然直观。如果要说Mean-Shift有什么缺点,那就是对高维球区域的半径r的定义,不同选择可能会产生高度不同的影响。

3、DBSCAN(具有噪声的基于密度的聚类方法)

DBSCAN是一种基于密度的聚类算法,它与mean-shift类似,但又有一些显著优势。我们先来看看下面这幅花哨的图。

在这里插入图片描述

计算步骤:

  1. 首先,DBSCAN算法会以任何尚未访问过的任意起始数据点为核心点,并对该核心点进行扩充。这时我们给定一个半径/距离ε,任何和核心点的距离小于ε的点都是它的相邻点。
  2. 如果核心点附近有足够数量的点,则开始聚类,且选中的核心点会成为该聚类的第一个点。如果附近的点不够,那算法会把它标记为噪声(之后这个噪声可能会成为簇中的一部分)。在这两种情形下,选中的点都会被标记为“已访问”。
  3. 一旦聚类开始,核心点的相邻点,或者说以该点出发的所有密度相连的数据点(注意是密度相连)会被划分进同一聚类。然后我们再把这些新点作为核心点,向周围拓展ε,并把符合条件的点继续纳入这个聚类中。
  4. 重复步骤2和3,直到附近没有可以扩充的数据点为止,即簇的ε邻域内所有点都已被标记为“已访问”。
  5. 一旦我们完成了这个集群,算法又会开始检索未访问过的点,并发现更多的聚类和噪声。一旦数据检索完毕,每个点都被标记为属于一个聚类或是噪声。

与其他聚类算法相比,DBSCAN有一些很大的优势:

首先,它不需要输入要划分的聚类个数。
其次,不像mean-shift,即使数据点非常不同,它也会将它们纳入聚类中,DBSCAN能将异常值识别为噪声,这就意味着它可以在需要时输入过滤噪声的参数。
第三,它对聚类的形状没有偏倚,可以找到任意大小和形状的簇。

DBSCAN的主要缺点是,当聚类的密度不同时,DBSCAN的性能会不如其他算法。这是因为当密度变化时,用于识别邻近点的距离阈值ε和核心点的设置会随着聚类发生变化。而这在高维数据中会特别明显,因为届时我们会很难估计ε。

4、层次聚类(Hierarchical Clustering)

参考自:“蓝鲸网站分析博客

层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有自下而上合并和自上而下分裂两种方法,本篇文章介绍合并方法。

img

其调用格式可见如下链接:

2.3. Clustering - scikit-learn 0.19.1 documentation

1.首先将每个数据点视为一个单一聚类,即如果数据集中有X个聚类。然后,我们选择一个度量测量两个聚类之间的距离。在本例中,我们使用平均连接,它将两个聚类间的距离定义为第一个数据集中的数据点和第二个聚类中数据点之间的平均距离。

2.每迭代一次,将两个聚类合并成为一个,作为平均连接最小的聚类。根据我们选择的聚类度量,这两个聚类间的距离最小,因此最相似,则应该合并起来。

3.重复步骤2直到遍历到树的根,即包含所有数据点的唯一一个聚类。通过这种方式,我们可以根据最后需要多少聚类,只需选择何时停止组合聚类,即何时停止构建树。

在这里插入图片描述

层次聚类的合并算法

层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。

欧几里德距离矩阵

层次聚类使用欧式距离来计算不同类别数据点间的距离(相似度)。我们在前面的几篇文章中都曾经介绍过欧氏距离的计算方法,本篇文章将通过创建一个欧式距离矩阵来计算和对比不同类别数据点间的距离,并对距离值最小的数据点进行组合。以下是欧式距离的计算公式。

img

以下为示例数据,我们通过欧氏距离计算下面A到G的欧式距离矩阵,并通过合并的方法将相似度最高的数据点进行组合,并创建聚类树。

img

创建欧式距离矩阵的方法很简单,将每个类别的数据点分别与A-G中的每个数据点计算距离值,其中A—>B表示数据点A到数据点B的距离,B—>A则代表数据点B到数据点A的距离。这两个距离值是相同的,因此欧式距离矩阵呈对角线对称(绿色部分和蓝色部分)。其中对角线的0值是数据点与自己的距离值。我们将所有数据点间的距离结果进行对比,选择其中距离最近的两个数据点进行组合,并迭代这一过程。下图显示了欧式矩阵的逻辑和计算方法。

img

数据点之间的距离

对于示例中的数据点,我们通过计算获得了下面的欧式距离矩阵。其中数据点B到数据点C的距离在所有的距离值中最小,为1.00。以下为数据点间距离值的计算公式。

img

经过计算数据点B和数据点C与其他数据点相比有最高的相似度。因此,我们将数据点B和数据点C进行组合。并再次计算其他数据点间的距离。

img

数据点与组合数据点间的距离

将数据点B与数据点C进行组合后,重新计算各类别数据点间的距离矩阵。数据点间的距离计算方式与之前的方法一样。这里需要说明的是组合数据点(B,C)与其他数据点间的计算方法。当我们计算(B,C)到A的距离时,需要分别计算B到A和C到A的距离均值。

img

经过计算数据点D到数据点E的距离在所有的距离值中最小,为1.20。这表示在当前的所有数据点中(包含组合数据点),D和E的相似度最高。因此我们将数据点D和数据点E进行组合。并再次计算其他数据点间的距离。

img

后面的工作就是不断的重复计算数据点与数据点,数据点与组合数据点间的距离。这个步骤应该由程序来完成。这里由于数据量较小,我们手工计算并列出每一步的距离计算和数据点组合的结果。

这一步中,数据点A和数据点F的距离值在所有距离值中最小,因此我们将A和F进行组合,生成组合数据点(A,F)。

img

到此为止除了数据点G以外,其他的数据点都已经根据距离值(相似度)进行了组合。聚类树的最底层已经完成。下面我们将继续计算组合数据点间的距离,并对相似度最高的组合数据点进行合并。

两个组合数据点间的距离

计算两个组合数据点间距离的方法有三种,分别为Single Linkage,Complete Linkage和Average Linkage。在开始计算之前,我们先来介绍下这三种计算方法以及各自的优缺点。

Single Linkage

Single Linkage的计算方法是将两个组合数据点中距离最近的两个数据点间的距离作为这两个组合数据点的距离。这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。

Complete Linkage

Complete Linkage的计算方法与Single
Linkage相反,将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。Complete Linkage的问题也与Single Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。

Average Linkage

Average Linkage的计算方法是计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的均值作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。

我们使用Average Linkage计算组合数据点间的距离。下面是计算组合数据点(A,F)到(B,C)的距离,这里分别计算了(A,F)和(B,C)两两间距离的均值。

img

通过计算及对比不同组合数据点间间的距离。(A,F)到(B,C)的距离在所有组合数据点间最小,为13.25。说明(A,F)到(B,C)相似度最高。因此,将(A,F)到(B,C)组合为(A,F,B,C)。

img

使用与之前相同的方法计算出组合数据点(D,E)和G的距离在目前所有组合数据点中最小。为34.70。将(D,E)和G组合为(D,E,G)。

img

最终,通过计算和合并,我们获得了两个组合数据点(A,F,B,C)和(D,E,G)。这也是聚类树的最顶层的两个数据点。下面,我们按之前的计算步骤来构建聚类树。

img

层次聚类树状图

将前面的每一步的计算结果以树状图的形式展现出来就是层次聚类树。最底层是原始A到G的7个数据点。依照7个数据点间的相似度组合为聚类树的第二层(A,F),(B,C),(D,E)和G。以此类推生成完整的层次聚类树状图。以下为简单的示意图。

img

应用案例https://zhuanlan.zhihu.com/p/33897525

5、谱聚类(Spectral clustering)

参考:https://blog.csdn.net/yc_1993/article/details/52997074?utm_source=blogxgwz2

https://blog.csdn.net/u012500237/article/details/72864258

http://lib.csdn.net/article/machinelearning/36648

https://www.cnblogs.com/pinard/p/6221564.html

6、基于GMM的EM聚类

均值→质心,方差→椭圆聚类,权重→聚类大小。

K-Means算法的主要缺点之一是它直接用了距离质心的平均值。我们可以从下图中看出这样做为什么不好——图的左侧是两个半径不同的同心圆,K-Means没法处理这个问题,因为这些聚类的平均值非常接近;图的右侧是一个中心对称的非圆形分布,K-Means同样解决不了它,因为如果单纯依靠均值判断,算法无法捕捉更多特征。

在这里插入图片描述

​ K-Means的两个失败案例

高斯混合模型(GMM)比K-Means算法具有更好的灵活性。它是多个高斯分布函数的线性组合,理论上可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况。对于GMM,我们假设数据点满足不同参数下的高斯分布——比起均值,这是一个限制较少的假设。我们用两个参数来描述聚类的形状:均值和标准差!以二维分布为例,标准差的存在允许聚类的形状可以是任何种类的椭圆形。因此这个算法的思想是:如果数据点符合某个高斯分布,那它就会被归类为那个聚类。

为了找到每个聚类的高斯参数,我们要用到一种名为期望最大化(EM)的优化算法。下图是高斯混合模型的聚类过程,那么,你知道怎么在其中运用EM算法吗?

在这里插入图片描述

  1. 首先,我们确定聚类的数量(如K-Means),并随机初始化每个聚类的高斯分布参数。你也可以尝试通过快速查看数据来为初始参数提供更好的猜测,但从上图可以看出,这其实不是很必要,因为算法会很快进行优化。
  2. 其次,根据每个聚类的高斯分布,计算数据点属于特定聚类的概率。如果数据点越接近高斯质心,那它属于该聚类的概率就越高。这很直观,因为对于高斯分布,我们一般假设大部分数据更靠近聚类质心。
  3. 在这些概率的基础上,我们为高斯分布计算一组新的参数,使聚类内数据点的概率最大化。我们用数据点位置的加权和来计算这些新参数,其中权重就是数据点属于聚类的概率。为了可视化这个过程,我们可以看看上面的图片,特别是黄色的聚类。第一次迭代中,它是随机的,大多数黄点都集中在该聚类的右侧。当我们按概率计算加权和后,虽然聚类的中部出现一些点,但右侧的比重依然很高。随着迭代次数增加,黄点在聚类中的位置也完成了“右下→左下”的移动。因此,标准差的变化调整着聚类的形状,以使它能更适合数据点的分布。
  4. 迭代步骤2和步骤3,直至收敛。

论智注:对于上述第3步,请结合混合高斯模型定义公式理解。如果我们设K为模型的个数,πk为第k个高斯的权重,即第k个高斯的概率密度函数,其均值为μk,方差为σk。我们对此概率密度的估计就是要求πk、μk和σk各个变量。当求出的表达式后,求和式的各项的结果就分别代表样本x属于各个类的概率。在做参数估计的时候,常采用的方法是最大似然。——引自 姜文晖《聚类(1)——混合高斯模型》

GMM有两个关键优势。首先它比K-Means更灵活,由于标准差的引入,最后聚类的形状不再局限于圆形,它还可以是大小形状不一的椭圆形——K均值实际上是GMM的一个特例,其中每个聚类的协方差在所有维上都接近0。其次,权重的引入为同一点属于多个聚类找到了解决方案。如果一个数据点位于两个聚类的重叠区域,那我们就可以简单为它定义一个聚类,或者计算它属于X聚类的百分比是多少,属于Y聚类的百分比是多少。简而言之,GMM支持混合“成员”。

谈及缺点,和K-Means相比,GMM每一步迭代的计算量比较大。另外,它的求解办法基于EM算法,因此有可能陷入局部极值,需要经过多次迭代。

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

当我们的数据可以被表示为网络或图是,可以使用图团体检测方法完成聚类。在这个算法中图团体(graph community)通常被定义为一种顶点(vertice)的子集,其中的顶点相对于网络的其他部分要连接的更加紧密。下图展示了一个简单的图,展示了最近浏览过的8个网站,根据他们的维基百科页面中的链接进行了连接。

在这里插入图片描述

模块性可以使用以下公式进行计算:
其中L代表网络中边的数量,代表真实的顶点i和j之间的边数, 代表每个顶点的degree,可以通过将每一行每一列的项相加起来而得到。两者相乘再除以2L表示该网络是随机分配的时候顶点i和j之间的预期边数。所以代表了该网络的真实结构和随机组合时的预期结构之间的差。当为1时,且很小的时候,其返回值最高。也就是说,当在定点i和j之间存在一个非预期边是得到的值更高。
是克罗内克函数(Kronecker-delta function). 下面是其Python解释:

def Kronecker_Delta(ci,cj):
    if ci==cj:
        return 1
    else:
        return 0

通过上述公式可以计算图的模块性,且模块性越高,该网络聚类成不同团体的程度越好,因此通过最优化方法寻找最大模块性就能发现聚类该网络的最佳方法。
组合学告诉我们对于一个仅有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。

8、K-Medoids聚类方法

http://shiyanjun.cn/archives/1398.html

9、结论

在文章的最后,就让我们以一幅聚类图做结,直观展示这些算法和其他算法的表现!
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值