机器学习 - 常见聚类算法

在这里插入图片描述


1. 无监督学习

对于那种没有label的数据,我们能做什么?

  • 聚类
  • 降维 (Dimensionality reduction)
  • 异常检测 (Outlier detection)

这篇博客介绍一下无监督学习中的聚类。

2. 关于聚类

  • 我们的目标:
  • 大的类内相似度
  • 小的类间相似度
  • 软聚类 vs 硬聚类
  • 软:一个样本可以被分为多类
  • 硬:一个样本只能被分为一类

3.聚类算法

3.1 K-Means聚类 – partitioning method

K-Means(k-平均或k-均值)可以称的上是知名度最高的一种聚类算法,代码非常容易理解和实现。

【算法1】K-means

  1. 随机初始化k个聚类质心点
  2. 迭代 t 步(或迭代到质心位置不再发生太大变化)
    2.1 计算每个数据点到质心的距离来进行分类,它跟哪个聚类的质心更近,它就被分类到该聚类。
    2.2 再重新计算每一聚类中所有向量的平均值,并确定出新的质心。

t为迭代次数,K为簇的数目,m为记录数,n为维数。

  • 时间复杂度 O ( t K m n ) O(tKmn) O(tKmn)
  • 空间复杂度 O ( ( m + K ) n ) O((m+K)n) O((m+K)n)

K-means的优点:

  • 当数据的分布有明显的簇的划分时,K-means表现很好。(works well when the clusters are compact clouds that are well-separated from each other)
  • 可以用来解决凸数据的聚类。(discover clusters with convex shapes or clusters with quite different size)

K-means的缺点:

  • k值的选取不太确定。
  • 一开始质心点的选取是随机的,不同的初始质心选择,会导致不同的结果。所以,K-means 一定能收敛,但不一定是最优解
  • 对噪声和outlier非常敏感

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

3.2 层次聚类 – hierarchical method

层次聚类实际上可以被分为两类:自上而下自下而上。其中自下而上算法(Bottom-up algorithms)首先会将每个数据点视为单个聚类,然后连续合并(或聚合)成对的聚类,直到所有聚类合并成包含所有数据点的单个聚类。它也因此会被称为hierarchical agglomerative clustering。该算法的聚类可以被表示为一幅树状图,树根是最后收纳所有数据点的单个聚类,而树叶则是只包含一个样本的聚类。
​​

【算法2】凝聚型层次聚类

  1. 把每个数据点看作是一个聚类。
  2. 迭代,直到只有一个聚类簇:
    2.1 找到距离最小的两个聚类簇 c i , c j c_i,c_j ci,cj
    2.2 将 c i , c j c_i,c_j ci,cj合并为一个簇

在这里插入图片描述

三种衡量聚类簇相似性的标准:

  • single linkage: 两个聚类簇中最相似的两个点的相似度
  • complete linkage: 两个聚类簇中最不相似的两个点的相似度
  • average linkage: 两个聚类簇中平均两两相似度

层次聚类不要求我们指定聚类的数量,由于这是一个构建树的过程,我们甚至可以选择那种聚类看起来更合适。它具有 O ( n 3 ) O(n^3) O(n3)的时间复杂度。

3.3 DBSCAN – density-based method

3.3.1 简介

【定义1】DBSCAN

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。 该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇。
它将簇定义为密度相连的点的最大集合。通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。

我们知道k-means聚类算法只能处理凸(球形)的簇,也就是一个聚成实心的团 (cloud), 这是因为算法本身计算平均距离的局限。但往往现实中还会有各种形状,比如下面这张图,传统的聚类算法显然无法解决。于是就思考,样本密度大的成一类呗。这就是DBSCAN聚类算法。

在这里插入图片描述

3.3.2 重要概念

假设我的样本集是 D = ( x 1 , x 2 , . . . , x m ) D=(x_1,x_2,...,x_m) D=(x1,x2,...,xm), 则DBSCAN具体的密度描述定义如下:

1) ϵ-邻域:对于一个样本 x j x_j xj,其ϵ-邻域包含样本集D中与 x j x_j xj的距离不大于ϵ的子样本集,这个子样本集的个数记为 ∣ N ϵ ( x j ) ∣ |Nϵ(x_j)| Nϵ(xj)
2) 核心对象:对于任一样本 x j x_j xj,如果其ϵ-邻域对应的 ϵ \epsilon ϵ邻域至少包含MinPts个样本,则 x j x_j xj是核心对象。 
3)直接密度可达:如果 x i x_i xi位于 x j x_j xj的ϵ-邻域中,且 x j x_j xj是核心对象,则称 x i x_i xi x j x_j xj直接密度可达。注意反之不一定成立,即此时不能说 x j x_j xj x i x_i xi密度直达, 除非 x i x_i xi也是核心对象。
4)密度可达:对于 x i x_i xi x j x_j xj,如果存在样本序列 p 1 , p 2 , . . . , p T p_1,p_2,...,p_T p1,p2,...,pT,满足 p 1 = x i , p T = x j p_1=x_i,p_T=x_j p1=xi,pT=xj, 且 p t + 1 p_{t+1} pt+1 p t p_t pt直接密度可达,则称 x j x_j xj x i x_i xi密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本 p 1 , p 2 , . . . , p T − 1 p_1,p_2,...,p_{T-1} p1,p2,...,pT1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。
5)密度相连:对于 x i x_i xi x j x_j xj,如果存在核心对象样本 x k x_k xk,使 x i x_i xi x j x_j xj均由 x k x_k xk密度可达,则称 x i x_i xi x j x_j xj密度相连。注意密度相连关系是满足对称性的。

从下图可以很容易看出理解上述定义,图中MinPts=5,红色的点都是核心对象,因为其ϵ-邻域至少有5个样本。黑色的样本是非核心对象。所有核心对象直接密度可达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能直接密度可达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的ϵ-邻域内所有的样本相互都是密度相连的。
在这里插入图片描述
定义:

  • 边界点(border point)在 ϵ \epsilon ϵ邻域内的点小于MinPts个,但它落在一个核心点的 ϵ \epsilon ϵ邻域内.(A border point has fewer than MinPts within Eps, but is in the neighborhood of a core p)
  • 噪声点(noise point)不在任何一个核心对象在周围.

在这里插入图片描述
右图中,绿色的点是核心对象,蓝色的点是边界点,红色的点是噪声。

3.3.3 算法

【算法3】DBSCAN

  1. 随机选一点p
  2. 根据参数Minpts和 ϵ \epsilon ϵ找到p点密度可达的一些点
    2.1 如果p是核心对象,则一个聚类簇已经形成了;
    2.2 如果p不是核心对象,没有点是从p开始密度可达的,于是跳过它访问下一个对象。

持续迭代,直到所有的点都被访问过。

3.3.4 复杂度分析

时间复杂度 O ( N 2 ) O(N^2) O(N2), 使用kd 树优化可以达到 O ( N l o g N ) O(NlogN) O(NlogN)

3.3.5 小结

我们什么时候需要用DBSCAN来聚类呢?一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。

  • DBSCAN的主要优点有:

  • 可以对任意形状的稠密数据集进行聚类。相对的,K-Means之类的聚类算法一般只适用于凸数据集。

  • 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。

  • 聚类结果没有偏倚。相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

  • DBSCAN的主要缺点有:

  • 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。

  • 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。

  • 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有很大影响。

3.4 EM聚类 – model_based clustering

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

(K-means算法的两个失败案例)

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

为了找到每个聚类的高斯参数,我们要用到EM算法。下图是高斯混合模型的聚类过程。

初始化
在这里插入图片描述
迭代数次之后:
在这里插入图片描述

  1. 随机初始化每个聚类的高斯分布参数。
  2. 根据每个聚类的高斯分布,计算数据点属于特定聚类的概率。如果数据点越接近高斯质心,那它属于该聚类的概率就越高。
  3. 为每个聚类的高斯分布计算一组新的参数,使聚类内数据点的概率最大化。我们用数据点位置的加权和来计算这些新参数,其中权重就是数据点属于聚类的概率

迭代步骤2和步骤3,直至收敛。

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

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

猜你喜欢

转载自blog.csdn.net/weixin_41332009/article/details/113859674