社区所有版块导航
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 年前 • 852 次点击  

↑↑↑↑↑点击上方蓝色字关注我们!






『运筹OR帷幄』原创


作者:华校专

作者信息:

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

编者按:

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

聚类(上)

  1. 在无监督学习(unsupervised learning)中,训练样本的标记信息是未知的。

  2. 无监督学习的目标:通过对无标记训练样本的学习来揭露数据的内在性质以及规律。

  3. 一个经典的无监督学习任务:寻找数据的最佳表达(representation)。常见的有:

  • 低维表达:试图将数据(位于高维空间)中的信息尽可能压缩在一个较低维空间中。
  • 稀疏表达:将数据嵌入到大多数项为零的一个表达中。该策略通常需要进行维度扩张。
  • 独立表达:使数据的各个特征相互独立。
  • 无监督学习应用最广的是聚类(clustering)

    • 给定数据集 ,聚类试图将数据集中的样本划分为 个不相交的子集 ,每个子集称为一个簇cluster。其中:
    • 通过这样的划分,每个簇可能对应于一个潜在的概念。这些概念对于聚类算法而言,事先可能是未知的。
    • 聚类过程仅仅能自动形成簇结构,簇所对应的概念语义需要由使用者来提供。
  • 通常用 表示样本 的簇标记cluster label,即 。于是数据集的聚类结果可以用包含个元素的簇标记向量来表示。

  • 聚类的作用:

    • 可以作为一个单独的过程,用于寻找数据内在的分布结构。
    • 也可以作为其他学习任务的前驱过程。如对数据先进行聚类,然后对每个簇单独训练模型。
  • 聚类问题本身是病态的。即:没有某个标准来衡量聚类的效果。

    但是实际上不知道这个平均距离对应于真实世界的物理意义。

    如:在图片识别中包含的图片有:红色卡车、红色汽车、灰色卡车、灰色汽车。可以聚类成:红色一类、灰色一类;也可以聚类成:卡车一类、汽车一类。

    解决该问题的一个做法是:利用深度学习来进行分布式表达,可以对每个车辆赋予两个属性:一个表示颜色、一个表示型号。

    • 可能很多不同的聚类都很好地对应了现实世界的某些属性,它们都是合理的。
    • 可以简单的度量聚类的性质,如每个聚类的元素到该类中心点的平均距离。

    一、性能度量

    1. 聚类的性能度量也称作聚类的有效性指标validity index

    2. 直观上看,希望同一簇的样本尽可能彼此相似,不同簇的样本之间尽可能不同。即:簇内相似度intra-cluster similarity高,且簇间相似度inter-cluster similarity低。

    3. 聚类的性能度量分两类:

    • 聚类结果与某个参考模型reference model进行比较,称作外部指标external index
    • 直接考察聚类结果而不利用任何参考模型,称作内部指标internal index

    1.1 外部指标

    1. 对于数据集 ,假定通过聚类给出的簇划分为。参考模型给出的簇划分为 ,其中 不一定相等 。

      分别表示 的簇标记向量。定义:

      其中 表示集合的元素的个数。各集合的意义为:

      由于每个样本对 仅能出现在一个集合中,因此有


    • :包含了同时隶属于 的样本对。
    • :包含了隶属于 ,但是不隶属于 的样本对。
    • :包含了不隶属于 , 但是隶属于的样本对。
    • :包含了既不隶属于 , 又不隶属于 的样本对。
  • 下述性能度量的结果都在 之间。这些值越大,说明聚类的性能越好。

  • 1.1.1 Jaccard系数

    1. Jaccard系数Jaccard Coefficient:JC

      它刻画了:所有的同类的样本对(要么在 中属于同类,要么在 中属于同类)中,同时隶属于 的样本对的比例。

    1.1.2 FM指数

    1. FM指数Fowlkes and Mallows Index:FMI

      它刻画的是:

    • 中同类的样本对中,同时隶属于 的样本对的比例为
    • 中同类的样本对中,同时隶属于 的样本对的比例为
    • FMI就是 和 p2 的几何平均。

    1.1.3 Rand指数

    1. Rand指数Rand Index:RI

      它刻画的是:

    • 同时隶属于 的同类样本对(这种样本对属于同一个簇的概率最大)与既不隶属于 又不隶属于 的非同类样本对(这种样本对不是同一个簇的概率最大)之和,占所有样本对的比例。
    • 这个比例其实就是聚类的可靠程度的度量。

    1.1.4 ARI指数

    1. 使用RI有个问题:对于随机聚类,RI指数不保证接近0(可能还很大)。

      ARI指数就通过利用随机聚类来解决这个问题。

    2. 定义一致性矩阵为:

      其中:

    • 为属于簇 的样本的数量, 为属于簇 的样本的数量。
    • 为同时属于簇 和簇 的样本的数量。

    则根据定义有: ,其中  表示组合数。数字2 是因为需要提取两个样本组成样本对。

  • 定义ARI指数Adjusted Rand Index:


    其中:

    • :表示同时隶属于 的样本对。

    • :表示最大的样本对。

      即:无论如何聚类,同时隶属于 的样本对不会超过该数值。

    • :表示在随机划分的情况下,同时隶属于 的样本对的期望。

      (1) 随机挑选一对样本,一共有 种情形。

      (2) 这对样本隶属于 中的同一个簇,一共有 种可能。

      (3) 这对样本隶属于 中的同一个簇,一共有 种可能。

      (4) 这对样本隶属于 中的同一个簇、且属于 中的同一个簇,一共有 种可能。

      (5) 则在随机划分的情况下,同时隶属于 的样本对的期望(平均样本对)为:

    1.2 内部指标

    1. 对于数据集 ,假定通过聚类给出的簇划分为 。定义:

      其中: 表示两点 之间的距离; 表示簇 的中心点, 表示簇 的中心点, 表示簇 的中心点之间的距离。

      上述定义的意义为:

    • :簇 中每对样本之间的平均距离。
    • :簇 中距离最远的两个点的距离。
    • :簇 之间最近的距离。
    • :簇 中心点之间的距离。

    1.2.1 DB指数

    1. DB指数Davies-Bouldin Index:DBI

      其物理意义为:

      该度量越小越好。

    • 给定一个簇 ,遍历其它的簇,寻找该度量的最大值。

    • 对所有的簇,取其最大度量的均值。

    • 给定两个簇,每个簇样本距离均值之和比上两个簇的中心点之间的距离作为度量。
  • 显然 越小越好。

    • 如果每个簇样本距离均值越小(即簇内样本距离都很近),则 越小。
    • 如果簇间中心点的距离越大(即簇间样本距离相互都很远),则 越小。

    1.2.2 Dunn指数

    1. Dunn指数Dunn Index:DI

      其物理意义为:任意两个簇之间最近的距离的最小值,除以任意一个簇内距离最远的两个点的距离的最大值。

    2. 显然 越大越好。

    • 如果任意两个簇之间最近的距离的最小值越大(即簇间样本距离相互都很远),则 越大。
    • 如果任意一个簇内距离最远的两个点的距离的最大值越小(即簇内样本距离都很近),则 越大。

    1.3 距离度量

    1. 距离函数 常用的有以下距离:

      考虑非数值类属性(如属性取值为:中国,印度,美国,英国),令 表示 的样本数; 表示 且位于簇 中的样本的数量。则在属性 上的两个取值 之间的 VDM距离为:

      该距离刻画的是:属性取值在各簇上的频率分布之间的差异。

    • 闵可夫斯基距离Minkowski distance:给定样本则闵可夫斯基距离定义为:

      (1) 当 时,闵可夫斯基距离就是欧式距离Euclidean distance

      (2) 当 时,闵可夫斯基距离就是曼哈顿距离Manhattan distance

    • VDM距离Value Difference Metric

  • 当样本的属性为数值属性与非数值属性混合时,可以将闵可夫斯基距离与 VDM 距离混合使用。

    假设属性 为数值属性, 属性 为非数值属性。则:

  • 当样本空间中不同属性的重要性不同时,可以采用加权距离。

    以加权闵可夫斯基距离为例:

  • 这里的距离函数都是事先定义好的。在有些实际任务中,有必要基于数据样本来确定合适的距离函数。这可以通过距离度量学习distance metric learning来实现。

  • 这里的距离度量满足三角不等式:,

    在某些任务中,根据数据的特点可能需要放松这一性质。如:美人鱼距离很近,美人鱼 距离很近,但是的距离很远。这样的距离称作非度量距离non-metric distance

  • 二、原型聚类

    1. 原型聚类prototype-based clustering假设聚类结构能通过一组原型刻画。

      常用的原型聚类有:

    • k均值算法k-means
    • 学习向量量化算法Learning Vector Quantization:LVQ
    • 高斯混合聚类Mixture-of-Gaussian

    2.1 k-means 算法

    2.1.1 k-means

    1. 给定样本集 , 假设一个划分为

      定义该划分的平方误差为:

      其中 是簇 的均值向量。

    • err 刻画了簇类样本围绕簇均值向量的紧密程度,其值越小,则簇内样本相似度越高。
    • k-means 算法的优化目标为:最小化 。即:
  • k-means 的优化目标需要考察 的所有可能的划分,这是一个NP难的问题。实际上k-means 采用贪心策略,通过迭代优化来近似求解。

    • 首先假设一组均值向量。

    • 然后根据假设的均值向量给出了 的一个划分。

    • 再根据这个划分来计算真实的均值向量:

      (1) 如果真实的均值向量等于假设的均值向量,则说明假设正确。根据假设均值向量给出的 的一个划分确实是原问题的解。

      (2) 如果真实的均值向量不等于假设的均值向量,则可以将真实的均值向量作为新的假设均值向量,继续迭代求解。

  • 这里的一个关键就是:给定一组假设的均值向量,如何计算出 的一个簇划分?

    k均值算法的策略是:样本离哪个簇的均值向量最近,则该样本就划归到那个簇。

  • k-means 算法:

    • 输入:

      (1) 样本集

      (2) 聚类簇数

    • 输出:簇划分

    • 算法步骤:

      (1) 从 中随机选择 个样本作为初始均值向量

      (2) 重复迭代直到算法收敛,迭代过程:

      (2.1) 初始化阶段:取

      (2.2) 划分阶段:令

      (2.2.1) 计算 的簇标记:, 。即:将 离哪个簇的均值向量最近,则该样本就标记为那个簇。

      (2.2.2) 然后将样本 划入相应的簇:

      (2.3) 重计算阶段:计算

      (2.4) 终止条件判断:

      (2.4.1) 如果对所有的 ,都有,则算法收敛,终止迭代。

      (2.4.2) 否则重赋值

  • k-means 优点:

    • 计算复杂度低,为 ,其中 为迭代次数。通常 和 q 要远远小于 ,此时复杂度相当于

    • 思想简单,容易实现。

  • k-means 缺点:

    通常进行多次k-means,然后选择最优的那次作为最终聚类结果。

    • 结果不一定是全局最优的,只能保证局部最优。

    • 对噪声敏感。因为簇的中心是取平均,因此聚类簇很远地方的噪音会导致簇的中心点偏移。

    • 无法解决不规则形状的聚类。

    • 无法处理离散特征,如:国籍、性别 等。

    • 需要首先确定聚类的数量

    • 分类结果严重依赖于分类中心的初始化。

    1. k-means 性质:

    • k-means 实际上假设数据是呈现球形分布,实际任务中很少有这种情况。与之相比,GMM 使用更加一般的数据表示,即高斯分布。

    • k-means 假设各个簇的先验概率相同,但是各个簇的数据量可能不均匀。

    • k-means 使用欧式距离来衡量样本与各个簇的相似度。这种距离实际上假设数据的各个维度对于相似度的作用是相同的。

    • k-means 中,各个样本点只属于与其相似度最高的那个簇,这实际上是 分簇。

    • k-means 算法的迭代过程实际上等价于EM 算法。具体参考EM 算法章节。

    2.1.2 k-means++

    1. k-means++ 属于 k-means 的变种,它主要解决 k-means 严重依赖于分类中心初始化的问题。

    2. k-means++ 选择初始均值向量时,尽量安排这些初始均值向量之间的距离尽可能的远。

    3. k-means++ 算法:

    • 输入:

      (1) 样本集

      (2) 聚类簇数

    • 输出:簇划分

    • 算法步骤:

      (1) 从 中随机选择1个样本作为初始均值向量组

      (2) 迭代,直到初始均值向量组有 个向量。

      假设初始均值向量组为 。迭代过程如下:

      (2.1) 对每个样本 ,分别计算其距 的距离。这些距离的最小值记做

      (2.2) 对样本 ,其设置为初始均值向量的概率正比于。即:离所有的初始均值向量越远,则越可能被选中为下一个初始均值向量。

      (2.3) 以概率分布 未归一化的)随机挑选一个样本作为下一个初始均值向量

      (3) 一旦挑选出初始均值向量组 ,剩下的迭代步骤与k-means 相同。

    2.1.3 k-modes

    1. k-modes 属于 k-means 的变种,它主要解决 k-means 无法处理离散特征的问题。

    2. k-modesk-means 有两个不同点(假设所有特征都是离散特征):

      其中 为示性函数。

      上式的意义为:样本之间的距离等于它们之间不同属性值的个数。

      其中 的取值空间为所有样本在第 个属性上的取值。

    • 簇中心的更新规则不同。在k-modes 算法中,簇中心每个属性的取值为:簇内该属性出现频率最大的那个值。
    • 距离函数不同。在k-modes 算法中,距离函数为:

    2.1.4 k-medoids

    1. k-medoids 属于 k-means 的变种,它主要解决k-means 对噪声敏感的问题。

    2. k-medoids 算法:

    • 输入:

      (1) 样本集

      (2) 聚类簇数

    • 输出:簇划分

    • 算法步骤:

      (1) 从 中随机选择 个样本作为初始均值向量

      (2) 重复迭代直到算法收敛,迭代过程:

      (2.1) 初始化阶段:取

      遍历每个样本 ,计算它的簇标记: 。即:将 离哪个簇的均值向量最近,则该样本就标记为那个簇。

      然后将样本 划入相应的簇:

      (2.2) 重计算阶段:

      遍历每个簇

      (2.2.1) 计算簇心 距离簇内其它点的距离

      (2.2.2) 计算簇 内每个点 距离簇内其它点的距离

      如果 ,则重新设置簇中心:

      (2.3) 终止条件判断:遍历一轮簇 之后,簇心保持不变。

  • k-medoids 算法在计算新的簇心时,不再通过簇内样本的均值来实现,而是挑选簇内距离其它所有点都最近的样本来实现。这就减少了孤立噪声带来的影响。

  • k-medoids 算法复杂度较高,为 。其中计算代价最高的是计算每个簇内每对样本之间的距离。

    通常会在算法开始时计算一次,然后将结果缓存起来,以便后续重复使用。

  • 2.1.5 mini-batch k-means

    1. mini-batch k-means 属于 k-means 的变种,它主要用于减少k-means 的计算时间。

    2. mini-batch k-means 算法每次训练时随机抽取小批量的数据,然后用这个小批量数据训练。这种做法减少了k-means 的收敛时间,其效果略差于标准算法。

    3. mini-batch k-means 算法:

    • 输入:

      (1) 样本集

      (2) 聚类簇数

    • 输出:簇划分

    • 算法步骤:

      (1) 从 中随机选择 个样本作为初始均值向量

      (2) 重复迭代直到算法收敛,迭代过程:

      (2.1) 初始化阶段:取

      (2.2) 划分阶段:随机挑选一个Batch 的样本集合 ,其中 为批大小。

      (2.2.1) 计算 的簇标记:,

      即:将 离哪个簇的均值向量最近,则该样本就标记为那个簇。

      (2.2.2) 然后将样本 划入相应的簇:

      (2.3) 重计算阶段:计算

      (2.4) 终止条件判断:

      (2.4.1) 如果对所有的 ,都有,则算法收敛,终止迭代。

      (2.4.2) 否则重赋值

    2.2 学习向量量化

    1. 与一般聚类算法不同,学习向量量化Learning Vector Quantization:LVQ假设数据样本带有类别标记,学习过程需要利用样本的这些监督信息来辅助聚类。

    2. 给定样本集 ,LVQ的目标是从特征空间中挑选一组样本作为原型向量

    • 每个原型向量代表一个聚类簇,簇标记 。即:簇标记从类别标记中选取。
    • 原型向量从特征空间中取得,它们不一定就是 中的某个样本。
  • LVQ的想法是:通过从样本中挑选一组样本作为原型向量 ,可以实现对样本空间 的簇划分。

    • 对任意样本 ,它被划入与距离最近的原型向量所代表的簇中。

    • 对于每个原型向量 ,它定义了一个与之相关的一个区域,该区域中每个样本与 的距离都不大于它与其他原型向量的距离。

    • 区域 对样本空间 形成了一个簇划分,该划分通常称作 Voronoi 剖分。

  • 问题是如何从样本中挑选一组样本作为原型向量?LVQ的思想是:

    • 首先挑选一组样本作为假设的原型向量。

    • 然后对于训练集中的每一个样本 , 找出假设的原型向量中,距离该样本最近的原型向量

      (1) 如果 的标记与 的标记相同,则更新 ,将该原型向量更靠近

      (2) 如果 的标记与 的标记不相同,则更新 ,将该原型向量更远离

    • 不停进行这种更新,直到迭代停止条件(如以到达最大迭代次数,或者原型向量的更新幅度很小)。

  • LVQ算法:

    • 输入:

      (1) 样本集

      (2) 原型向量个数

      (3) 各原型向量预设的类别标记

      (4) 学习率

    • 输出:原型向量

    • 算法步骤:

      (1) 依次随机从类别 中挑选一个样本,初始化一组原型向量

      (2) 重复迭代,直到算法收敛。迭代过程如下:

      (2.1) 从样本集 中随机选取样本 ,挑选出距离 最近的原型向量

      (2.2) 如果 的类别等于 ,则:

      (2.3) 如果 的类别不等于 ,则:

  • 在原型向量的更新过程中:

    则更新后的原型向量 距离 更近。

    则更新后的原型向量 距离 更远。

    • 如果 的类别不等于 ,则更新后, 距离为:

    • 如果 的类别等于 ,则更新后, 距离为:

  • 这里有一个隐含假设:即计算得到的样本 该样本可能不在样本集中) 的标记就是更新之前的标记。

    即:更新操作只改变原型向量的样本值,但是不改变该原型向量的标记。

  • 2.3 高斯混合聚类

    1. 高斯混合聚类采用概率模型来表达聚类原型。

    2. 对于 维样本空间 中的随机向量 ,若 服从高斯分布,则其概率密度函数为 :

      其中 为 n 维均值向量, 的协方差矩阵。 的概率密度函数由参数 决定。

    3. 定义高斯混合分布: 。该分布由 个混合成分组成,每个混合成分对应一个高斯分布。其中:

    • , 是第 个高斯混合成分的参数。
    • 是相应的混合系数,满足
  • 假设训练集 的生成过程是由高斯混合分布给出。

    令随机变量 表示生成样本 的高斯混合成分序号, 的先验概率

    生成样本的过程分为两步:

    • 首先根据概率分布 生成随机变量
    • 再根据 的结果,比如 , 根据概率生成样本。
  • 根据贝叶斯定理, 若已知输出为 ,则的后验分布为:

    其物理意义为:所有导致输出为 的情况中, 发生的概率。

  • 当高斯混合分布已知时,高斯混合聚类将样本集 划分成 个簇

    对于每个样本 ,给出它的簇标记 为:

    即:如果 最有可能是 产生的,则将该样本划归到簇

    这就是通过最大后验概率确定样本所属的聚类。

  • 现在的问题是,如何学习高斯混合分布的参数。由于涉及到隐变量 ,可以采用EM算法求解。

    具体求解参考EM 算法的章节部分。


  • 相关文章推荐

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



    本文福利

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


    —— 完 ——




    文章须知

    文章作者:华校专 

    责任编辑:周岩 logic 征帆

    审核编辑:阿春

    微信编辑:征帆

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

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



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