社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

数据科学 | 算法工程师必备的机器学习--聚类(下)

运筹OR帷幄 • 4 年前 • 1169 次点击  
↑↑↑↑↑点击上方蓝色字关注我们!






『运筹OR帷幄』原创


作者:华校专

作者信息:

华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。

编者按:

算法工程师必备系列更新啦!继上次推出了算法工程师必备的特征工程后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!接下来,就让我们紧跟作者的步伐,一起畅游聚类世界吧!

聚类(下)

三、密度聚类

  1. 密度聚类density-based clustering假设聚类结构能够通过样本分布的紧密程度确定。
  2. 密度聚类算法从样本的密度的角度来考察样本之间的可连接性,并基于可连接样本的不断扩张聚类簇,从而获得最终的聚类结果。

3.1 DBSCAN 算法

  1. DBSCAN是一种著名的密度聚类算法,它基于一组邻域参数 来刻画样本分布的紧密程度。

  2. 给定数据集 , 定义:

    即: 包含了样本集 中与 距离不大于 的所有的样本。

    即:若 -邻域中至少包含 个样本,则 是一个核心对象。

  • 密度直达directyl density-reachable:若 是一个核心对象,且 , 则称 密度直达,记作

  • 密度可达density-reachable:对于 , 若存在样本序列 , 其中 ,如果 密度直达,则称 密度可达,记作

  • 密度相连density-connected:对于 ,若存在 ,使得 均由 密度可达,则称 密度相连,记作

  • 核心对象core object:若 ,则称 是一个核心对象。
  • -邻域:
  • DBSCAN算法的簇定义:给定邻域参数 , 一个簇 是满足下列性质的非空样本子集:

    即一个簇是由密度可达关系导出的最大的密度相连样本集合。

    • 连接性 connectivity:若 ,则
    • 最大性maximality:若 ,且, 则
  • DBSCAN算法的思想:若 为核心对象,则 密度可达的所有样本组成的集合记作 。可以证明 就是满足连接性与最大性的簇。

    于是 DBSCAN 算法首先任选数据集中的一个核心对象作为种子seed,再由此出发确定相应的聚类簇。

  • DBSCAN算法:

    • 输入:

      (1) 数据集

      (2) 邻域参数

    • 输出:簇划分

    • 算法步骤:

      (1) 初始化核心对象集合为空集:

      (2) 寻找核心对象:

      (2.1) 遍历所有的样本点 , 计算

      (2.2) 如果 ,则

      (3) 迭代:以任一未访问过的核心对象为出发点,找出有其密度可达的样本生成的聚类簇,直到所有核心对象都被访问为止。

  • 注意:

    • 若在核心对象 的寻找密度可达的样本的过程中,发现核心对象 是由 密度可达的,且 尚未被访问,则将 加入 所属的簇,并且标记 为已访问。
    • 对于 中的样本点,它只可能属于某一个聚类簇。因此在核心对象 的寻找密度可达的样本的过程中,它只能在标记为未访问的样本中寻找 标记为已访问的样本已经属于某个聚类簇了)。
  • DBSCAN 算法的优点:

    • 簇的数量由算法自动确定,无需人工指定。
    • 基于密度定义,能够对抗噪音。
    • 可以处理任意形状和大小的簇。
  • DBSCAN 算法的缺点:

    • 若样本集的密度不均匀,聚类间距差相差很大时,聚类质量较差。因为此时参数 和 MinPts 的选择比较困难。
    • 无法应用于密度不断变化的数据集中。

    3.2 Mean-Shift 算法

    1. Mean-Shift 是基于核密度估计的爬山算法,可以用于聚类、图像分割、跟踪等领域。

    2. 给定 维空间的 个样本组成的数据集 ,给定一个中心为 、半径为 的球形区域 (称作兴趣域),定义其mean shift 向量为:

    3. Mean-Shift 算法的基本思路是:

      移动过程中,兴趣域范围内的所有样本都标记为同一个簇。

      因此Mean-Shift 会向着密度最大的区域移动。

      下图中:蓝色为当前的兴趣域,红色为当前的中心点 紫色向量为mean shift 向量,灰色为移动之后的兴趣域

    • 如果mean shift 向量为 ,则停止移动,说明兴趣域 已到达数据点最密集的区域。
    • 首先任选一个点作为聚类的中心来构造兴趣域

    • 然后计算当前的mean shift 向量,兴趣域的中心移动为:

  • 在计算mean shift 向量的过程中假设每个样本的作用都是相等的。实际上随着样本与中心点的距离不同,样本对于mean shift 向量的贡献不同。

    定义高斯核函数为: ,则重新mean shift 向量定义为:

    其中 称做带宽。 刻画了样本 距离中心点 相对于半径 的相对距离。

  • Mean_Shift 算法:

    迭代,直到所有的样本都被访问过。迭代过程为(设已有的簇为 1,2,\cdots,L-1 ):

    (1) 在未访问过的样本中随机选择一个点作为中心点 ,找出距它半径为 兴趣域,记做 。将 中的样本的簇标记设置为 (一个新的簇)。

    (2) 计算当前的mean shift 向量,兴趣域中心的移动为:

    在移动过程中,兴趣域内的所有点标记为访问过,并且将它们的簇标记设置为

    (3) 如果 ,则本次结束本次迭代。

    (4) 设已有簇中,簇 的中心点 距离最近,如果 ,则将当前簇和簇合并。

    合并时,当前簇中的样本的簇标记重新修改为

    当所有的样本都被访问过时,重新分配样本的簇标记(因为可能有的样本被多个簇标记过):若样本被多个簇标记过,则选择最大的那个簇作为该样本的簇标记。即:尽可能保留大的簇。

    • 输入:

      (1) 数据集

      (2) 带宽参数

      (3) 迭代阈值 ,簇阈值

    • 输出:簇划分

    • 算法步骤:

  • 可以证明:Mean_Shift 算法每次移动都是向着概率密度函数增加的方向移动。

    维欧式空间中,对空间中的点 的概率密度估计为:

    其中:

    因此有: 。则有梯度:

    的导数为 。取 为新的轮廓函数, (一个正数)为新的标准化常数,

    则有:

    定义 ,则它表示基于核函数 的概率密度估计,始终为非负数。

    根据前面定义:,则有:

    因此 正比于 ,因此mean shift 向量的方向始终指向概率密度增加最大的方向。

    上式计算 时需要考虑所有的样本,计算复杂度太大。作为一个替代,可以考虑使用 距离 内的样本,即兴趣域 内的样本。即可得到:

    • 表示空间中的核函数, 为带宽矩阵。
    • 通常 采用放射状对称核函数 的轮廓函数, (一个正数)为标准化常数从而保证 的积分为
    • 通常带宽矩阵采用 为带宽参数。
  • Mean-Shift 算法优点:

    • 簇的数量由算法自动确定,无需人工指定。
    • 基于密度定义,能够对抗噪音。
    • 可以处理任意形状和大小的簇。
    • 没有局部极小值点,因此当给定带宽参数 时,其聚类结果就是唯一的。
  • Mean_Shift 算法缺点:

    • 无法控制簇的数量。
    • 无法区分有意义的簇和无意义的簇。如:在Mean_Shift 算法中,异常点也会形成它们自己的簇。

    四、层次聚类

    1. 层次聚类hierarchical clustering 试图在不同层次上对数据集进行划分,从而形成树形的聚类结构。

    4.1 AGNES 算法

    1. AGglomerative NESting:AGNES是一种常用的采用自底向上聚合策略的层次聚类算法。

    2. AGNES首先将数据集中的每个样本看作一个初始的聚类簇,然后在算法运行的每一步中,找出距离最近的两个聚类簇进行合并。

      合并过程不断重复,直到达到预设的聚类簇的个数。

    3. 这里的关键在于:如何计算聚类簇之间的距离?

      由于每个簇就是一个集合,因此只需要采用关于集合的某个距离即可。给定聚类簇 , 有三种距离:

      最小距离由两个簇的最近样本决定。

      最大距离由两个簇的最远样本决定。

      平均距离由两个簇的所有样本决定。

    • 平均距离:
    • 最大距离:
    • 最小距离:
  • AGNES 算法可以采取上述任意一种距离:

    • AGNES算法的聚类簇距离采用 时,称作单链接single-linkage算法。
    • AGNES算法的聚类簇距离采用 时,称作全链接complete-linkage算法。
    • AGNES算法的聚类簇距离采用 时,称作均链接average-linkage算法 。
  • AGNES算法:

    • 输入:

      (1) 数据集

      (2) 聚类簇距离度量函数

      (3) 聚类簇数量

    • 输出:簇划分

    • 算法步骤:

      (1) 初始化:将每个样本都作为一个簇

      (2) 迭代,终止条件为聚类簇的数量为 。迭代过程为:

      计算聚类簇之间的距离,找出距离最近的两个簇,将这两个簇合并。

      每进行一次迭代,聚类簇的数量就减少一些。

  • AGNES 算法的优点:

    • 距离容易定义,使用限制较少。
    • 可以发现聚类的层次关系。
  • AGNES 算法的缺点:

    • 计算复杂度较高。
    • 算法容易聚成链状。

    4.2 BIRCH 算法

    1. BIRCH:Balanced Iterative Reducing and Clustering Using Hierarchies 算法通过聚类特征树CF Tree:Clustering Feature True来执行层次聚类,适合于样本量较大、聚类类别数较大的场景。

    4.2.1 聚类特征

    1. 聚类特征CF:每个CF 都是刻画一个簇的特征的三元组: 。其中:

    • :表示簇内样本数量的数量。
    • :表示簇内样本的线性求和: ,其中 为该CF 对应的簇。
    • :表示簇内样本的长度的平方和。 ,其中 为该CF 对应的簇。
  • 根据CF 的定义可知:如果CF1CF2 分别表示两个不相交的簇的特征,如果将这两个簇合并成一个大簇,则大簇的特征为:

    即:CF 满足可加性。

  • 给定聚类特征CF,则可以统计出簇的一些统计量:

    • 簇心:
    • 簇内数据点到簇心的平均距离(也称作簇的半径):
    • 簇内两两数据点之间的平均距离(也称作簇的直径):
  • 给定两个不相交的簇,其特征分别为

    假设合并之后的簇为 ,其中

    可以通过下列的距离来度量 CF1CF2 的相异性:

    • 簇心欧氏距离centroid Euclidian distance,其中 分别为各自的簇心。

    • 簇心曼哈顿距离centroid Manhattan distance

    • 簇连通平均距离average inter-cluster distance

    • 全连通平均距离average intra-cluster distance

    • 方差恶化距离variance incress distance

    4.2.2 CF 树

    1. CF树的结构类似于平衡B+树 。树由三种结点构成:根结点、中间结点、叶结点。

    • 根结点、中间结点:由若干个聚类特征CF ,以及这些CF 指向子结点的指针组成。

    • 叶结点:由若干个聚类特征CF 组成。

      (1) 叶结点没有子结点,因此CF 没有指向子结点的指针。

      (2) 所有的叶结点通过双向链表连接起来。

      (3) 在BIRCH 算法结束时,叶结点的每个CF 对应的样本集就对应了一个簇。

         

  • CF 树有三个关键参数:

    • 枝平衡因子 :非叶结点中,最多不能包含超过 CF
    • 叶平衡因子 :叶结点中,最多不能包含超过 CF
    • 空间阈值 :叶结点中,每个 CF 对应的子簇的大小(通过簇半径 来描述)不能超过
  • 由于 CF 的可加性,所以 CF 树中,每个父结点的 CF 等于它所有子结点的所有 CF 之和。

  • CF 树的生成算法:

    • 输入:

      (1) 样本集

      (2) 枝平衡因子

      (2.1) 叶平衡因子

      (2.2) 空间阈值

    • 输出:CF

    • 算法步骤:

      (1) 初始化:CF 树的根结点为空。

      (2) 随机从样本集 中选出一个样本,放入一个新的 CF 中,并将该 CF 放入到根结点中。

      (3) 遍历 中的样本,并向 CF 树中插入。迭代停止条件为:样本集 中所有样本都插入到 CF 树中。

      迭代过程如下:

      (3.1) 随机从样本集 中选出一个样本 ,从根结点向下寻找与距离最近的叶结点,和里与最近的

      (3.2) 如果 加入到 对应的簇中之后,该簇的簇半径 ,则将 加入到 对应的簇中,并更新路径上的所有CF 。本次插入结束。

      (3.3) 否则,创建一个新的CF,将 放入该CF 中,并将该CF 添加到叶结点 中。如果 CF 数量小于 ,则更新路径上的所有CF 。本次插入结束。

      (3.4) 否则,将叶结点 分裂为两个新的叶结点 。分裂方式为:

      (3.4.1) 选择叶结点 中距离最远的两个CF,分别作为 中的首个CF

      (3.4.2) 将叶结点 中剩下的CF 按照距离这两个CF 的远近,分别放置到 中。

      (3.5) 依次向上检查父结点是否也需要分裂。如果需要,则按照和叶子结点分裂方式相同。

    4.2.3 BIRCH 算法

    1. BIRCH 算法的主要步骤是建立 CF 树,除此之外还涉及到 CF 树的瘦身、离群点的处理。

    2. BIRCH 需要对CF 树瘦身,有两个原因:

    • 将数据点插入到CF 树的过程中,用于存储CF 树结点及其相关信息的内存有限,导致部分数据点生长形成的CF 树占满了内存。因此需要对CF 树瘦身,从而使得剩下的数据点也能插入到CF 树中。
    • CF 树生长完毕后,如果叶结点中的CF 对应的簇太小,则会影响后续聚类的速度和质量。
  • BIRCH 瘦身是在将 增加的过程。算法会在内存中同时存放旧树 和新树 ,初始时刻 为空。

    • 算法同时处理 ,将 中的 CF 迁移到 中。
    • 在完成所有的CF 迁移之后, 为空, 就是瘦身后的 CF 树。
  • BIRCH 离群点的处理:

    稀疏子簇:簇内数据点的数量远远少于所有子簇的平均数据点的那些子簇。

    将稀疏子簇放入待定区时,需要同步更新CF 树上相关路径及结点。

    如果数据点无法插入到CF 树中,则可以确定为真正的离群点。

    • 中所有数据点都被插入之后,扫描待定区中的所有数据点(这些数据点就是候选的离群点),并尝试将其插入到CF 树中。
    • 在对CF 瘦身之后,搜索所有叶结点中的所有子簇,寻找那些稀疏子簇,并将稀疏子簇放入待定区。
  • BIRCH 算法:

    • 输入:

      (1) 样本集

      (2) 枝平衡因子

      (2.1) 叶平衡因子

      (2.2) 空间阈值

    • 输出:CF

    • 算法步骤:

      (1) 建立 树。

      (2) (可选)对CF 树瘦身、去除离群点,以及合并距离非常近的CF

      (3) (可选)利用其它的一些聚类算法(如:k-means)对CF树的所有叶结点中的CF 进行聚类,得到新的CF 树。

      这是为了消除由于样本读入顺序不同导致产生不合理的树结构。

      这一步是对 结构进行聚类。由于每个CF 对应一组样本,因此对CF 聚类就是对 进行聚类。

      (4) (可选)将上一步得到的、新的CF 树的叶结点中每个簇的中心点作为簇心,对所有样本按照它距这些中心点的距离远近进行聚类。

      这是对上一步的结果进行精修。

  • BIRCH 算法优点:

    • 节省内存。所有样本都存放在磁盘上,内存中仅仅存放CF 结构。
    • 计算速度快。只需要扫描一遍就可以建立CF 树。
    • 可以识别噪声点。
  • BIRCH 算法缺点:

    • 结果依赖于数据点的插入顺序。原本属于同一个簇的两个点可能由于插入顺序相差很远,从而导致分配到不同的簇中。甚至同一个点在不同时刻插入,也会被分配到不同的簇中。

    • 对非球状的簇聚类效果不好。这是因为簇直径 和簇间距离的计算方法导致。

    • 每个结点只能包含规定数目的子结点,最后聚类的簇可能和真实的簇差距很大。

  • BIRCH 可以不用指定聚类的类别数

    • 如果不指定 ,则最终叶结点中CF 的数量就是
    • 如果指定 ,则需要将叶结点按照距离远近进行合并,直到叶结点中CF 数量等于

    五、谱聚类

    1. 谱聚类spectral clustering 是一种基于图论的聚类方法。

    2. 谱聚类的主要思想是:基于数据集 来构建图 ,其中:

    • 顶点  :由数据集中的数据点组成: 。

    • 边  :任意一对顶点之间存在边。

      距离越近的一对顶点,边的权重越高;距离越远的一对顶点,边的权重越低。

         通过对图 进行切割,之间的边的权重尽可能的低、各子图内的边的权重尽       可能的高。这样就完成了聚类。

         

    5.1 邻接矩阵

    1. 在图 中,定义权重 为顶点 之间的权重,其中

      定义 为邻接矩阵:

         由于 为无向图,因此 。即:

    • 对图中顶点  ,定义它的度  为:所有与顶点  相连的边的权重之和: 。

            定义度矩阵 为一个对角矩阵,其中对角线分别为各顶点的度:

         

    • 对于顶点集合 的一个子集 ,定义为子集中点的个数;定义,为子集 中所有点的度之和。

    2. 事实上在谱聚类中,通常只给定数据集 ,因此需要计算        出邻接矩阵

      • 基本思想是:距离较近的一对点(即相似都较高),边的权重较高;距离较远的一对点(即相似度较低),边的权重较低。

      • 基本方法是:首先构建相似度矩阵 ,然后使用近邻法、K 近邻法、或者全连接法。      

      (1) 通常相似度采用高斯核: 。此时有 。即:

      (2) 也可以选择不同的核函数,如:多项式核函数、高斯核函数、sigmoid 核函数。

      3. ϵ-近邻法:设置一个距离阈值 ,定义邻接矩阵为:

          即:一对相似度小于  的点,边的权重为 否则边的权重为

          ϵ-近邻法得到的权重要么是  ,要么是 ,权重度量很不精确,因此实际应        用较少。

      4. K 近邻法:利用 KNN 算法选择每个样本最近的 个点作为近邻,其它点与      当前点之间的边的权重为

          这种做法会导致邻接矩阵 非对称,因为当 近邻时, 不      一定是 的 K 近邻。

          为了解决对称性问题,有两种做法:

      • 只有两个点互为对方的 近邻中,则认为是近邻。即:取交集。

      • 只要一个点在另一个点的 近邻中,则认为是近邻。即:取并集。

      5. 全连接法:所有点之间的权重都大于

      5.2 拉普拉斯矩阵

      1. 定义拉普拉斯矩阵 ,其中 为度矩阵、 为邻接矩阵。

      2. 拉普拉斯矩阵 的性质:

        设其 个实特征值从小到大为 ,即:

      • 是对称矩阵,即 。这是因为 , 都是对称矩阵。

      • 因为 是实对称矩阵,因此它的特征值都是实数。

      • 对任意向量 ,有:

      • 是半正定的,且对应的 个特征值都大于等于0,且最小的特征值为

      5.3 谱聚类算法

      1. 给定无向图 ,设子图的点的集合和子图的点的集合都是的子集,且

        定义 之间的切图权重为:

        即:所有连接 之间的边的权重。

      2. 对于无向图 ,假设将它切分为 个子图:每个子图的点的集合为 ,满足

        定义切图cut 为: ,其中 的补集。

      5.3.1 最小切图

      1. 引入指示向量 ,定义:

            则有:

          因此 。其中     , 为矩阵的迹。

          考虑到顶点 有且仅位于一个子图中,则有约束条件:

      2. 最小切图算法: 最小的切分。即求解:

      3. 最小切图切分使得不同子图之间的边的权重尽可能的低,但是容易产生分割      出只包含几个顶点的较小子图的歪斜分割现象。

      5.3.2 RatioCut 算法

      1. RatioCut 切图不仅考虑最小化 ,它还考虑最大化每个子图的点的个数。即:

      • 最小化 :使得不同子图之间的边的权重尽可能的低。
      • 最大化每个子图的点的个数:使得各子图尽可能的大。
    1. 引入指示向量 ,定义:

    2.       则有:

            因此 。其中                       为矩阵的迹。

            考虑到顶点 有且仅位于一个子图中,则有约束条件:

      3. RatioCut算法: 最小的切分。即求解:

           因此只需要求解 最小的 个特征值,求得对应的 个特征向量组成

           通常在求解得到 之后,还需要对行进行标准化:

      4. 事实上这样解得的 不能完全满足指示向量的定义。因此在得到 之后,      还需要对每一行进行一次传统的聚类(如:k-means 聚类)。

      5.RatioCut 算法:

        • 输入:

          (1) 数据集

          (2) 降维的维度

          (3) 二次聚类算法

          (4) 二次聚类的维度

        • 输出:聚类簇

        • 算法步骤:

          (1) 根据 构建相似度矩阵

          (2) 根据相似度矩阵构建邻接矩阵 度矩阵,计算拉普拉斯矩阵

          (3) 计算 最小的 个特征值,以及对应的特征向量 ,构建矩阵

          (4) 对 按照行进行标准化: ,得到

          (5) 将 中每一行作为一个 维的样本,一共 个样本,利用二次聚类算法来聚类,二次聚类的维度为

          最终得到簇划分

        5.3.3 Ncut 算法

        1. Ncut 切图不仅考虑最小化 ,它还考虑最大化每个子图的边的权重。即:

        • 最小化 使得不同子图之间的边的权重尽可能的低。
        • 最大化每个子图的边的权重:使得各子图内的边的权重尽可能的高。
      1. 引入指示向量 ,定义:

        则有:

        因此 。其中 为矩阵的迹。

        考虑到顶点 有且仅位于一个子图中,则有约束条件:

      2. 3. Ncut算法: 最小的切分。即求解

        4. 令 ,则有:

            令 ,则最优化目标变成:

            因此只需要求解 最小的 个特征值,求得对应的 个特征向量组成           。 然后对行进行标准化:

            与RatioCut 类似,Ncut 也需要对 的每一行进行一次传统的聚类(如:k-means 聚类)。

        5. 事实上 相当于对拉普拉斯矩阵 进行了一次标准化:                  

        6.Ncut 算法:

          • 输入:

            (1) 数据集

            (2) 降维的维度

            (3) 二次聚类算法

            (4) 二次聚类的维度

          • 输出:聚类簇

          • 算法步骤:

            (1) 根据 构建相似度矩阵

            (2) 根据相似度矩阵构建邻接矩阵 度矩阵,计算拉普拉斯矩阵

            (3) 构建标准化之后的拉普拉斯矩阵

            (4) 计算 最小的 个特征值,以及对应的特征向量 ,构建矩阵

             (5) 对 按照行进行标准化: ,得到

             (6) 将 中每一行作为一个 维的样本,一共 个样本,利用二次            聚类算法来聚类,二次聚类的维度为

                  最终得到簇划分

          5.4 性质

          1. 谱聚类算法优点:

          • 只需要数据之间的相似度矩阵,因此处理稀疏数据时很有效。

          • 由于使用了降维,因此在处理高维数据聚类时效果较好。

            2. 谱聚类算法缺点:

          •  如果最终聚类的维度非常高,则由于降维的幅度不够,则谱聚类的运行速   度和最后聚类的效果均不好。

          •  类效果依赖于相似度矩阵,不同相似度矩阵得到的最终聚类效果可能不   同。

          相关文章推荐

          往期算法工程师系列文章请点击蓝字标题,即可阅读《数据科学|算法工程师必备的机器学习--特征工程》



          本文福利

          可以在 公众号后台 回复关键词: DS “ 获取大量由我平台编辑精心整理的学习资料,如果觉得有用, 请勿吝啬你的留言和赞哦!


          —— 完 ——




          文章须知

          文章作者:华校专 

          责任编辑:周岩 logic 征帆

          审核编辑:阿春

          微信编辑:征帆

          本文由『运筹OR帷幄』原创发布

          如需转载请在公众号后台获取转载须知

          Python社区是高质量的Python/Django开发社区
          本文地址:http://www.python88.com/topic/106699
           
          1169 次点击