文章目录

  • 1. 简介
  • 1.1 聚类的定义
  • 1.2 聚类和分类的区别
  • 1.3 聚类的一般过程
  • 1.4 数据对象间的相似度度量
  • 1.5 cluster之间的相似度度量
  • 2. 数据聚类方法
  • 2.1 划分式聚类方法
  • 2.1.1 k-means 算法
  • 2.1.2 k-means++ 算法
  • 2.1.3 bi-kmeans 算法
  • 2.1.4 K-Medians 算法
  • 2.2 基于滑动窗口的方法
  • 2.2.1 均值偏移聚类算法
  • 2.3 使用高斯混合模型 GMM 的期望最大化 EM 聚类
  • 2.4 基于密度的方法
  • 2.4.1 DBSCAN 算法
  • 2.4.2 OPTICS 算法
  • 2.5 层次化聚类方法
  • 2.3.1 Agglomerative 算法
  • 2.4 聚类方法比较
  • 参考


1. 简介

1.1 聚类的定义

聚类(Clustering)是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。

1.2 聚类和分类的区别

  • 聚类(Clustering):是指把相似的数据划分到一起,具体划分的时候并不关心这一类的标签,目标就是把相似的数据聚合到一起,聚类是一种无监督学习(Unsupervised Learning)方法。
  • 分类(Classification):是把不同的数据划分开,其过程是通过训练数据集获得一个分类器,再通过分类器去预测未知数据,分类是一种监督学习(Supervised Learning)方法。

1.3 聚类的一般过程

  1. 数据准备:特征标准化和降维
  2. 特征选择:从最初的特征中选择最有效的特征,并将其存储在向量中
  3. 特征提取:通过对选择的特征进行转换形成新的突出特征
  4. 聚类:基于某种距离函数进行相似度度量,获取簇
  5. 聚类结果评估:分析聚类结果,如距离误差和(SSE)等

1.4 数据对象间的相似度度量

数值型数据,使用下表中的相似度度量方法。

相似度度量准则

相似度度量函数

Minkowski距离

聚合层 深度学习_深度学习

Manhattan距离

聚合层 深度学习_相似度_02

Euclidean距离

聚合层 深度学习_机器学习_03

Chebyshev距离

聚合层 深度学习_机器学习_04

Minkowski距离就是聚合层 深度学习_机器学习_05范数(聚合层 深度学习_聚合层 深度学习_06),其中 Manhattan距离、Euclidean距离、Chebyshev距离分别对应 聚合层 深度学习_深度学习_07

1.5 cluster之间的相似度度量

除了衡量对象之间的距离之外,有些聚类算法(如层次聚类)还衡量cluster之间的距离 ,假设聚合层 深度学习_聚类_08聚合层 深度学习_深度学习_09 为两个 cluster,则前四种方法定义的聚合层 深度学习_聚类_08聚合层 深度学习_深度学习_09

相似度度量准则

相似度度量函数

Single-link

聚合层 深度学习_聚类_12

Complete-link

聚合层 深度学习_相似度_13

UPGMA

聚合层 深度学习_相似度_14

WPGMA

聚合层 深度学习_相似度_15

  • Single-link定义的两个cluster之间的距离:两个cluster之间距离最近的两个点之间的距离;
    这种方法会在聚类的过程中产生链式效应,即有可能会出现非常大的cluster。
  • Complete-link定义的两个cluster之间的距离:两个cluster之间距离最远的两个点之间的距离;
    这种方法可以避免链式效应`,对异常样本点(不符合数据集的整体分布的噪声点)却非常敏感,容易产生不合理的聚类;
  • UPGMA定义的两个cluster之间的距离:两个cluster之间所有点距离的平均值;
    它是Single-link和Complete-link方法的折中;
  • WPGMA:两个cluster 之间两个对象之间的距离的加权平均值;
    加权的目的是为了使两个 cluster 对距离的计算的影响在同一层次上,而不受 cluster 大小的影响,具体公式和采用的权重方案有关。

2. 数据聚类方法

数据聚类方法主要分类:

  1. 划分式聚类方法(Partition-based Methods)
    k-means、k-means++、bi-kmeans、K-Medians……
  2. 基于滑动窗口的方法
    均值偏移聚类算法
  3. 基于密度的聚类方法(Density-based methods)
    DBSCAN、OPTICS…
  4. 层次化聚类方法(Hierarchical Methods)
    Agglomerative、Divisive…
  5. 新方法
    量子聚类、核聚类、谱聚类…

2.1 划分式聚类方法

划分式聚类方法需要事先指定簇类的数目或者聚类中心,通过反复迭代,直至最后达到簇内的点足够近,簇间的点足够远的目标。
经典的划分式聚类方法有k-means及其变体k-means++、bi-kmeans、kernel k-means等。

2.1.1 k-means 算法

经典的k-means算法的流程如下:

  1. 创建k个点作为初始质心(通常是随机选择)
  2. 当任意一个点的簇分配结果发生改变时
     1. 对数据集中的每个数据点
       1. 对每个质心
         1.计算质心与数据点之间的距离
       2. 将数据点分配到距其最近的簇
     2. 对每个簇,计算簇中所有点的均值并将均值作为质心

经典k-means源代码图1.1中,通过观察发现大致可以分为4类,所以取聚合层 深度学习_聚类_16图1.2为过程演示。



聚合层 深度学习_聚合层 深度学习_17

图1.1 K-Means聚类。原始数据集(左) 测试数据效果(右)



聚合层 深度学习_聚合层 深度学习_18

图1.2 k-means聚类过程


看起来很顺利,但事情并非如此,我们考虑k-means算法中最核心的部分,假设聚合层 深度学习_聚合层 深度学习_19是数据点,聚合层 深度学习_聚合层 深度学习_20是初始化的数据中心,那么目标函数为:
聚合层 深度学习_聚合层 深度学习_21
这个函数是非凸优化函数,会收敛于局部最优解,可以参考证明过程。例如,聚合层 深度学习_深度学习_22,则目标函数为:
聚合层 深度学习_深度学习_23
该函数的曲线如图1.3所示,可以发现该函数有两个局部最优点:



聚合层 深度学习_深度学习_24

图1.3 目标函数曲线


当初始质心点取值不同的时候,最终的聚类效果也不一样。举一个具体的实例,根据图1.4(左),下方的数据应该归为一类,而上方的数据应该归为两类。图1.4(右)是由于初始质心点选取的不合理造成的误分。



聚合层 深度学习_机器学习_25

图1.4 初始质心点选取的不合理


聚合层 深度学习_聚类_26值的选取对结果的影响也非常大,同样取上图中数据集,取聚合层 深度学习_聚合层 深度学习_27可以得到如 图1.5 的聚类结果:



聚合层 深度学习_机器学习_28

图1.5 不同 k 值


优点:

  1. 速度非常快,只是计算点和簇中心之间的距离,线性复杂度 O(n)。

缺点:

  1. 需要提前确定聚合层 深度学习_深度学习_29值。但我们希望它能从数据中获得一些启示,自动生成。
  2. 对初始质心点敏感。K-Means从随机选择的聚类中心开始,因此不同的运行可能产生不同的聚类结果。结果可能是不重复的,缺乏一致性。
  3. 对异常数据敏感
2.1.2 k-means++ 算法

k-means++是针对k-means中初始质心点选取的优化算法。该算法的流程和k-means类似,改变的地方只有初始质心的选取,该部分的算法流程如下:

  1. 随机选取一个数据点作为初始的聚类中心
  2. 当聚类中心数量小于k
     1. 计算每个数据点与当前已有聚类中心的最短距离,用聚合层 深度学习_相似度_30表示, 这个值越大,表示被选取为下一个聚类中心的概率越大,最后使用轮盘法选取下一个聚类中心

k-means++源代码,使用k-means++对上述数据做聚类处理,得到的结果如图1.6



聚合层 深度学习_机器学习_31

图1.6 k-means++聚类结果


2.1.3 bi-kmeans 算法

一种度量聚类效果的指标是 SSE(Sum of Squared Error),表示聚类后的簇离该簇的聚类中心的平方和,SSE越小,表示聚类效果越好
bi-kmeans是针对kmeans算法会陷入局部最优的缺陷进行的改进算法。
该算法基于SSE最小化的原理,首先将所有的数据点视为一个簇,然后将该簇一分为二,之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分是否能最大程度的降低SSE的值。
该算法的流程如下:

  1. 将所有点视为一个簇
  2. 当簇的个数小于k时
     1. 对每一个簇
      1. 计算总误差
      2. 在给定的簇上面进行k- means聚类(ke = 2)
      3. 计算将该簇一分为二之后的总误差
     2. 选取使得误差最小的那个簇进行划分操作

bi-kmeans算法源代码,利用bi-kmeans算法处理上节中的数据得到的结果如图1.7所示。



聚合层 深度学习_聚类_32

图1.7 bi-kmeans聚类结果


这是全局最优的方法,所以每次计算出来的SSE值基本也是一样的(但是还是不排除有部分随机分错的情况)。
对比k-means、k-means++、bi-kmeans算法的SSE值:

序号

k-means

k-means++

bi-kmeans

1

2112

120

106

2

338

125

106

3

824

127

106

agv

1108

124

106

可以发现,k-means每次计算出来的SSE都较大且不太稳定;k-means++计算出来的SSE较稳定并且数值较小;
bi-kmeans 4次计算出来的SSE都一样,并且计算的SSE都较小,聚类的效果也最好。

2.1.4 K-Medians 算法

使用均值的中间值来重新计算簇中心点。
优点:使用中间值,对离群值的敏感度较低。
缺点:对于较大的数据集来说,速度慢,因为在计算中值向量时,每次迭代都需要进行排序。

2.2 基于滑动窗口的方法

2.2.1 均值偏移聚类算法

均值偏移(Mean shift)聚类算法是一种基于滑动窗口(sliding-window)的算法,它试图找到密集的数据点。它还是一种基于中心的算法,它的目标是定位每一组簇的中心点,通过更新中心点的候选点来实现滑动窗口中的点的平均值。这些候选窗口在后期处理阶段被过滤,以消除几乎重复的部分,形成最后一组中心点及其对应的组。过程如下图2.1



聚合层 深度学习_深度学习_33

图2.1 bi-kmeans聚类结果


单滑动窗口的均值偏移聚类:

  1. 考虑二维空间中的一组点,如上例,从一个随机选择点 C 为中心的圆形滑窗开始,以半径 r 为内核。均值偏移是一种爬山算法(hill climbing algorithm),它需要在每个步骤中反复地将这个内核移动到一个更高的密度区域,直到收敛。
  2. 在每一次迭代中,滑动窗口会移向密度较高的区域,将中心点移动到窗口内的点的平均值。滑动窗口中的密度与它内部的点的数量成比例。自然地,通过移向窗口中点的平均值,它将逐渐向更高的点密度方向移动。
  3. 继续根据均值移动滑动窗口,直到没有方向移动可以容纳内核中的更多点,不再增加密度,也就是窗口中的点数。
  4. 步骤 1 到 3 的过程是用许多滑动窗口完成的,直到所有的点都位于一个窗口内。当多个滑动窗口重叠的时候,包含最多点的窗口会被保留。然后,数据点根据它们所在的滑动窗口聚类。

图2.2为从端到端所有滑动窗口的过程演示。每个黑点代表一个滑动窗口的质心,每个灰色点都是一个数据点。



聚合层 深度学习_机器学习_34

图2.2 从端到端所有滑动窗口的过程


优点:

  1. 与K-Means聚类相比,不需要选择聚类的数量。
  2. 聚类中心收敛于最大密度点,它直观地理解并适合于一种自然数据驱动。

缺点:

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

2.3 使用高斯混合模型 GMM 的期望最大化 EM 聚类

K-Means的缺点:对聚类中心的平均值的使用很简单。如下图3.1所示,图3.1左有两个以相同的平均值为中心,半径不同的圆形的聚类,因为聚类的均值非常接近,K-Means无法处理;图3.1右在聚类不是循环的情况下,使用均值作为聚类中心,K-Means也会失败。



聚合层 深度学习_聚合层 深度学习_35

图3.1 K-Means的两个失败案例


高斯混合模型 GMMs 比K-Means更灵活,使用高斯混合模型,假设数据点是高斯分布,有平均值和标准差两个参数来描述聚类的形状。以二维样本点为例,聚类可以采用任何形式的椭圆形(因为在x和y方向上都有标准差)。因此,每个高斯分布可归属于一个单独的聚类。

为了找到每个聚类的高斯分布的参数(平均值和标准差),使用期望最大化 EM 的优化算法。过程如图3.2 ,高斯混合模型是被拟合到聚类上的,然后继续进行期望的过程,即使用高斯混合模型实现最大化聚类。



聚合层 深度学习_机器学习_36

图3.2 使用高斯混合模型来期望最大化聚类


  1. 首先选择聚类的数量,然后随机初始化每个聚类的高斯分布参数。通过快速查看数据,可以尝试为初始参数提供良好的猜测。在上图中可以看到,这不是必要的,因为高斯开始时的表现不好,但是很快就被优化了。
  2. 给定每个聚类的高斯分布,计算每个数据点属于特定聚类的概率。一个点离高斯中心越近,它就越有可能属于那个聚类。这是很直观的,因为有一个高斯分布,我们假设大部分的数据都离聚类中心很近。
  3. 基于这些概率,为高斯分布计算一组新的参数,这样能最大程度地利用聚类中的数据点的概率。使用数据点位置的加权和来计算新参数,权重是属于该特定聚类的数据点的概率。(如上面的图中的黄色聚类。分布在第一次迭代中是随机的,但是我们可以看到大多数的黄色点都在这个分布的右边。当我们计算一个由概率加权的和,即使在中心附近有一些点,它们中的大部分都在右边。因此,自然分布的均值更接近于这些点。可以看到,大多数点都是“从右上角到左下角”。)因此,标准差的变化是为了创造一个更符合这些点的椭圆,从而使概率的总和最大化。
  4. 迭代地重复步骤2和3,直到收敛,即分布不会从迭代到迭代的过程中变化很多。

优点:

  1. 高斯混合模型在聚类协方差方面比K-Means要灵活得多;根据标准差参数,聚类可以是任何椭圆形状,而不局限于圆形。K-Means实际上是高斯混合模型的一个特例,每个聚类在所有维度上的协方差都接近0。
  2. 根据高斯混合模型的使用概率,每个数据点可以有多个聚类。因此,如果一个数据点位于两个重叠的聚类的中间,通过说X%属于1类,而y%属于2类,简单地定义它的类。

2.4 基于密度的方法

k-means算法对于凸性数据具有良好的效果,能够根据距离将数据分为球状类的簇,但对于非凸形状的数据点,就无能为力了,当k-means算法对环形数据聚类时的情况如图4.1



聚合层 深度学习_聚合层 深度学习_37

图4.1 k-means算法对环形数据聚类结果


图4.1可以看到,kmeans聚类产生了错误的结果,这个时候就需要用到基于密度的聚类方法了,该方法需要定义两个参数聚合层 深度学习_聚类_38聚合层 深度学习_机器学习_39,分别表示密度的邻域半径和邻域密度阈值。DBSCAN就是其中的典型。

2.4.1 DBSCAN 算法



聚合层 深度学习_聚合层 深度学习_40

图4.2 DBSCAN 聚类过程


考虑集合聚合层 深度学习_聚类_41聚合层 深度学习_聚类_38定义密度的邻域半径,设聚类的邻域密度阈值为聚合层 深度学习_机器学习_39,有以下定义:

  • 聚合层 深度学习_相似度_44邻域(聚合层 深度学习_相似度_44-neighborhood):
    聚合层 深度学习_聚合层 深度学习_46
  • 密度(desity) 聚合层 深度学习_相似度_47的密度:
    聚合层 深度学习_深度学习_48
  • 核心点(core-point):
    聚合层 深度学习_相似度_49,若聚合层 深度学习_聚合层 深度学习_50,则称聚合层 深度学习_相似度_47聚合层 深度学习_聚类_52的核心点,记聚合层 深度学习_聚类_52中所有核心点构成的集合为聚合层 深度学习_机器学习_54,记所有非核心点构成的集合为聚合层 深度学习_聚类_55
  • 边界点(border-point):
    聚合层 深度学习_深度学习_56,且聚合层 深度学习_深度学习_57,满足聚合层 深度学习_聚合层 深度学习_58
    聚合层 深度学习_相似度_47聚合层 深度学习_相似度_44邻域中存在核心点,则称聚合层 深度学习_相似度_47聚合层 深度学习_聚类_52的边界点,记聚合层 深度学习_聚类_52中所有的边界点构成的集合为聚合层 深度学习_机器学习_64
    边界点另一定义:若聚合层 深度学习_深度学习_56,且聚合层 深度学习_相似度_47落在某个核心点的聚合层 深度学习_相似度_44邻域内,则称聚合层 深度学习_相似度_47聚合层 深度学习_聚类_52的一个边界点,一个边界点可能同时落入一个或多个核心点的聚合层 深度学习_相似度_44邻域。
  • 噪声点(noise-point)
    聚合层 深度学习_相似度_47满足
    聚合层 深度学习_深度学习_72

图4.3所示,设聚合层 深度学习_相似度_73,则A为核心点,B、C是边界点,而N是噪声点。



聚合层 深度学习_聚类_74

图4.3 各个定义的示例


该算法的流程如下:

  1. 标记所有对象为unvisited
  2. 当有标记对象时
     1. 随机选取一个unvisited对象 p
     2. 标记 p 为 visited
     3. 如果 p 的 聚合层 深度学习_深度学习_75 邻域内至少有 M 个对象,则
      1. 创建一个新的簇 C,并把 p 放入 C 中
      2. 设 N 是 p 的 聚合层 深度学习_深度学习_75 邻域内的集合,对 N 中的每个点 p’
        1. 如果点 p’ 是unvisited
          1. 标记 p’ 为visited
          2. 如果 p’ 的 聚合层 深度学习_深度学习_75 邻域至少有 M个对象,则把这些点添加到 N
          3. 如果 p’ 还不是任何簇的成员,则把 p’ 添加到 C
      3. 保存 C
     4. 否则标记 p 为噪声

构建邻域的过程可以使用 kd-tree 进行优化,循环过程可以使用Numba、Cython、C进行优化,·DBSCAN·的源代码,使用该节一开始提到的数据集,聚类效果如图4.4



聚合层 深度学习_相似度_78

图4.4 DBSCAN算法对环形数据聚类结果


聚类的过程示意图4.5



聚合层 深度学习_深度学习_79

图4.5 聚类的过程


当设置不同的聚合层 深度学习_聚类_38 时,会产生不同的结果,如下图4.6所示:



聚合层 深度学习_聚合层 深度学习_81

图4.6 不同的 ε


当设置不同的聚合层 深度学习_机器学习_39时,会产生不同的结果,如下图4.7所示:



聚合层 深度学习_相似度_83

图4.7 不同的 M


优点:

  1. 需要提前确定聚合层 深度学习_相似度_44聚合层 深度学习_深度学习_85
  2. 不需要提前设置聚类的个数
  3. 对初值选取敏感,对噪声不敏感,可以将异常值识别为噪声。但对于均值偏移聚类算法,即使数据点非常不同,它也会将它们放入一个聚类中。
  4. 能很好地找到任意大小和形状的聚类。

缺点:

  1. 对密度不均的数据聚合效果不好,因为当密度变化时,邻域半径聚合层 深度学习_深度学习_86和密度阈值聚合层 深度学习_深度学习_85的设置会随着聚类的不同而变化。
  2. 高维数据的聚合效果不好,因为聚合层 深度学习_深度学习_86难以估计。
2.4.2 OPTICS 算法

DBSCAN算法中,使用了统一的聚合层 深度学习_聚类_38值,当数据密度不均匀的时候,如果设置了较小的聚合层 深度学习_聚类_38值,则较稀疏的 cluster 中的节点密度会小于聚合层 深度学习_机器学习_39,会被认为是边界点而不被用于进一步的扩展;如果设置了较大的聚合层 深度学习_聚类_38值,则密度较大且离的比较近的cluster容易被划分为同一个cluster,如下图4.8所示。



聚合层 深度学习_聚合层 深度学习_93

图4.8 设置了较小 较大的 ε


  • 如果设置的聚合层 深度学习_相似度_44较大,将会获得A,B,C这3个cluster
  • 如果设置的聚合层 深度学习_相似度_44较小,将会只获得C1、C2、C3这3个cluster

对于密度不均的数据选取一个合适的聚合层 深度学习_聚类_38是很困难的,对于高维数据,由于维度灾难 (Curse of dimensionality) ,聚合层 深度学习_聚类_38的选取将变得更加困难。

解决DBSCAN遗留下的问题:
提出一种算法,使得基于密度的聚类结构能够呈现出一种特殊的顺序,该顺序所对应的聚类结构包含了每个层级的聚类的信息,并且便于分析。
OPTICS(Ordering Points To Identify the Clustering Structure, OPTICS)实际上是DBSCAN算法的一种有效扩展,主要解决对输入参数敏感的问题。即选取有限个邻域参数聚合层 深度学习_相似度_98进行聚类,这样就能得到不同邻域参数下的聚类结果。

在介绍·OPTICS·算法之前,再扩展几个概念。

  • 核心距离(core-distance)
    样本 聚合层 深度学习_机器学习_99,对于给定的聚合层 深度学习_相似度_44聚合层 深度学习_深度学习_85,使得聚合层 深度学习_相似度_47成为核心点的最小邻域半径称为聚合层 深度学习_相似度_47的核心距离,其数学表达如下
    聚合层 深度学习_机器学习_104
    其中,聚合层 深度学习_深度学习_105表示在集合聚合层 深度学习_聚类_106中与节点聚合层 深度学习_相似度_47聚合层 深度学习_相似度_108近邻的节点,如聚合层 深度学习_机器学习_109表示聚合层 深度学习_聚类_106中与聚合层 深度学习_相似度_47最近的节点,如果聚合层 深度学习_相似度_47为核心点,则必然会有聚合层 深度学习_聚合层 深度学习_113
  • 可达距离(reachability-distance)
    聚合层 深度学习_聚合层 深度学习_114,对于给定的参数聚合层 深度学习_相似度_44聚合层 深度学习_深度学习_85聚合层 深度学习_聚合层 深度学习_117关于聚合层 深度学习_相似度_47的可达距离定义为:
    聚合层 深度学习_机器学习_119
    特别地,当聚合层 深度学习_相似度_47为核心点时,可以按照下式来理解聚合层 深度学习_深度学习_121的含义:
    聚合层 深度学习_相似度_122
    聚合层 深度学习_聚合层 深度学习_123)表示使得"聚合层 深度学习_相似度_47为核心点"且"聚合层 深度学习_聚合层 深度学习_117聚合层 深度学习_相似度_47直接密度可达"同时成立的最小邻域半径。
    可达距离的意义在于衡量聚合层 深度学习_聚合层 深度学习_117所在的密度,密度越大,他从相邻节点直接密度可达的距离越小,如果聚类时想要朝着数据尽量稠密的空间进行扩张,那么可达距离最小是最佳的选择。

举例,下图4.9中假设聚合层 深度学习_相似度_73,半径是聚合层 深度学习_聚合层 深度学习_129。那么聚合层 深度学习_聚合层 深度学习_130点的核心距离是聚合层 深度学习_机器学习_131,点2的可达距离是聚合层 深度学习_机器学习_131,点3的可达距离也是聚合层 深度学习_机器学习_131,点4的可达距离则是聚合层 深度学习_聚类_134的距离。



聚合层 深度学习_聚类_135

图4.9 核心距离 可达距离


OPTICS源代码,算法流程如下:

  1. 标记所有对象为unvisited,初始化order_ list为空
  2. 当有标记对象时
     1. 随机选取一个unvisited对象聚合层 深度学习_聚合层 深度学习_136
     2. 标记聚合层 深度学习_聚合层 深度学习_136为visited, 插入结果序列order_list中
     3. 如果聚合层 深度学习_聚合层 深度学习_136聚合层 深度学习_深度学习_75邻域内至少有聚合层 深度学习_聚合层 深度学习_140个对象,则
       1. 初始化seed_ list种子列表
       2. 调用insert_list(), 将邻域对象中未被访问的节点按照可达距离插入队列seed_ list中
       3. 当seed_ list列表不为空
         1. 按照可达距离升序取出seed_list中第一个元素 聚合层 深度学习_聚类_141
         2. 标记 聚合层 深度学习_聚类_141为visited, 插入结果序列order_list中
         3. 如果 聚合层 深度学习_聚类_141 的 ε 邻域内至少有 聚合层 深度学习_聚合层 深度学习_140个对象,则
           1. 调用insert _list(), 将邻域对象中未被访问的节点按照可达距离插入队列seeld_list中

算法中有一个很重要的insert_list()函数,这个函数如下:

  1. 对i中所有的邻域点聚合层 深度学习_相似度_145
  2. 如果k:未被访问过
     1. 计算rd(k,i)
     2. 如果rk = UNDEFINED
       1. 聚合层 深度学习_聚合层 深度学习_146
       2. 将节点k:按照可达距离插入seed_ list中
     3. 否则
       1. 如果聚合层 深度学习_聚合层 深度学习_147
       2. 更新聚合层 深度学习_聚合层 深度学习_148的值,并按照可达距离重新插入seed. _ist中

OPTICS算法输出序列的过程如图4.10



聚合层 深度学习_聚合层 深度学习_149

图4.10 OPTICS 算法输出序列


该算法最终获取知识是一个输出序列,该序列按照密度不同将相近密度的点聚合在一起,而不是输出该点所属的具体类别,如果要获取该点所属的类型,需要再设置一个参数聚合层 深度学习_聚类_150提取出具体的类别。

举个例子,如图4.11,随机生成三组密度不均的数据,我们使用DBSCAN和OPTICS来看一下效果:



聚合层 深度学习_深度学习_151

图4.11 使用DBSCAN OPTICS


可见,OPTICS第一步生成的输出序列较好的保留了各个不同密度的簇的特征,根据输出序列的可达距离图,再设定一个合理的ε′\varepsilon’,便可以获得较好的聚类效果。

2.5 层次化聚类方法

前面介绍的几种算法确实可以在较小的复杂度内获取较好的结果,但是这几种算法却存在一个链式效应的现象,比如:A与B相似,B与C相似,那么在聚类的时候便会将A、B、C聚合到一起,但是如果A与C不相似,就会造成聚类误差,严重的时候这个误差可以一直传递下去,如图5.1。为了降低链式效应,这时候层次聚类就该发挥作用了。



聚合层 深度学习_聚类_152

图5.1 链式效应


层次聚类算法 (hierarchical clustering) 将数据集划分为一层一层的 clusters,后面一层生成的 clusters 基于前面一层的结果。层次聚类算法,如图5.2一般分为两类:

  • Agglomerative 层次聚类:又称自底向上(bottom-up)的层次聚类,每一个对象最开始都是一个 cluster,每次按一定的准则将最相近的两个 cluster 合并生成一个新的 cluster,如此往复,直至最终所有的对象都属于一个 cluster。这里主要关注此类算法。
  • Divisive 层次聚类: 又称自顶向下(top-down)的层次聚类,最开始所有的对象均属于一个 cluster,每次按一定的准则将某个 cluster划分为多个 cluster,如此往复,直至每个对象均是一个 cluster


聚合层 深度学习_聚合层 深度学习_153

图5.2 层次聚类


另外,需指出的是,层次聚类算法是一种贪心算法(greedy algorithm),因其每一次合并或划分都是基于某种局部最优的选择。

2.3.1 Agglomerative 算法

给定数据集 聚合层 深度学习_聚类_41,Agglomerative层次聚类最简单的实现方法分为以下几步:

  1. 初始时每个样本为一个cluster,计算距离矩阵聚合层 深度学习_相似度_155,其中元素聚合层 深度学习_深度学习_156为样本点聚合层 深度学习_深度学习_157聚合层 深度学习_深度学习_158之间的距离;
  2. 遍历距离矩阵聚合层 深度学习_相似度_155,找出其中的最小距离(对角线. 上的除外),并由此得到拥有最小距离的两个cluster 的编号,将这两个cluster 合并为一个新的cluster 并依据cluster距离度量方法更新距离矩阵聚合层 深度学习_相似度_155 (删
    除这两个cluster对应的行和列,并把由新cluster 所算出来的距离向量插入聚合层 深度学习_相似度_155中),存储本次合并的
    相关信息;
  3. 重复2的过程,直至最终只剩下一个cluster

Agglomerative算法源代码,可以看到,该 算法的时间复杂度为 聚合层 深度学习_聚合层 深度学习_162(由于每次合并两个 cluster 时都要遍历大小为 聚合层 深度学习_机器学习_163的距离矩阵来搜索最小距离,而这样的操作需要进行聚合层 深度学习_深度学习_164 次),空间复杂度为聚合层 深度学习_机器学习_163



聚合层 深度学习_聚类_166

图5.3


图5.3中分别使用了层次聚类中4个不同的cluster度量方法,可以看到,使用single-link确实会造成一定的链式效应,而使用complete-link则完全不会产生这种现象,使用average-link和ward-link则介于两者之间。

优点:

  1. 不指定聚类的数量,可以选择较好的聚类
  2. 该算法对距离度量的选择不敏感,都很好,而其他聚类算法,距离度量的选择是至关重要的。
  3. 当底层数据具有层次结构时,可以恢复层次结构;其他的聚类算法无法做到。

缺点:

  1. 低效率,时间复杂度为 聚合层 深度学习_聚类_167,与K-Means和高斯混合模型的线性复杂度不同。

2.4 聚类方法比较

算法类型

适合的数据类型

抗噪点性能

聚类形状

算法效率

kmeans

混合型

较差

球形

很高

k-means++

混合型

一般

球形

较高

bi-kmeans

混合型

一般

球形

较高

DBSCAN

数值型

较好

任意形状

一般

OPTICS

数值型

较好

任意形状

一般

Agglomerative

混合型

较好

任意形状

较差