当前位置: 代码迷 >> 综合 >> 机器学习算法拾遗:(五)聚类算法(K-means,密度聚类,层次聚类)
  详细解决方案

机器学习算法拾遗:(五)聚类算法(K-means,密度聚类,层次聚类)

热度:52   发布时间:2023-12-16 18:08:37.0

基础:聚类算法(K-means,密度聚类,层次聚类)

无监督学习是在样本的标签未知的情况下,根据样本的内在规律对样本进行分类,常见的无监督学习就是聚类算法。

聚类算法模型的性能度量大致有两类:

  1)将模型结果与某个参考模型(或者称为外部指标)进行对比,私认为这种方法用的比较少,因为需要人为的去设定外部参考模型。

  2)另一种是直接使用模型的内部属性,比如样本之间的距离(闵可夫斯基距离)来作为评判指标,这类称为内部指标。

1、K-means聚类

  K-means算法是聚类算法的一种,实现起来比较简单,效果也不错。K-means的思想很简单,对于给定的样本集,根据样本之间距离的大小将样本划分为K个簇(在这里K是需要预先设定好的),在进行划分簇时要尽量让簇内的样本之间的距离很小,让簇与簇之间的距离尽量大。

  在给定的数据集D的条件下,将数据集划分为K类,则K-means的数学模型可以表示为:      

  

  其中CiCi为第ii类的集合,μiμi为第ii类的簇心(该簇内所有样本的均值,也称为均值向量)

  K-means算法的具体流程如下(数据来源 机器学习-周志华版):

 在这里主要核心有两步:一是计算样本到各簇心的距离,将样本划分到距离最小的那一簇中;二是在将所有的样本都划分完之后,计算各簇心的样本均值向量,然后将该均值向量设为新的簇心。而迭代的终止条件是当前均值向量和簇心是基本一致。

  对于K-means有两个可以优化的地方:

  1)在初始化时,随机选择K个样本作为初始的簇心,倘若此时随机的结果不好,比如两个随机的簇心挨得很近,这可能会导致模型收敛的速度减慢,常见的解决方式是先随机选取一个样本作为簇心,计算样本到该簇心的距离,随机选择下一个簇心,此时选取时会倾向于选择和与最近簇心之间距离较大的样本作为簇心,直到选择完K个簇心。

  2)每次迭代时都要计算所有样本和所有簇心之间的距离,若此时样本很大,或者簇心很多时,计算代价是非常大的,因此每次随机抽取一小批样本来更新当前的簇心(通过无放回随机采样)。除了这种方式之外还有一种K-means方法(elkan K-means)也可以减少距离的计算。

 K-means算法的优点:

  1)原理简单,实现容易,且收敛速度也较快。

  2)聚类效果较好,而且可解释性较强。

  3)参数很少,需要调的参数只有簇的个数K。

  K-means算法的缺点:

  1)K值的选取比较难

  2)对于非凸数据集收敛比较难

  3)如果隐含类别的数据不平衡,则聚类效果不佳,比如隐含类型的方差不同,方差较大的类中的样本可能会被聚类到其他类别中,在聚类时原则上没啥影响,但是聚类或者说无监督学习大多时候都是一些预训练,聚类后的数据可能之后会被用于其他的分类回归模型中

  4)对噪声和异常点比较敏感

  5)迭代得到的结果只是局部最优

2、密度聚类与DBSCAN

 

密度聚类算法假定聚类结构能通过样本分布的紧密程度来确定。同一类别的样本,他们之间是紧密相连的,通过样本密度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。因此密度聚类也是不需要提前设置簇数K的值的。

  DBSCAN是基于一组领域来描述样本集的紧密程度的,在描述DBSCAN算法之前我们先引入几个概念:

  给定数据集D{x1, x2, ......xn}

  1)?- 邻域:对于xi ,其邻域中包含了所有与xi 的距离小于? 的样本

  2)核心对象:对于任一样本xj∈D,如果其?-邻域对应的N ? (xj)至少包含MinPts个样本,即如果|N ? (xj)| ≥ MinPts,则xj是核心对象

  3)密度直达:如果xi 位于xj 的?-邻域中,且xj 是核心对象,则称xi 由xj 密度直达。注意反之不一定成立,即此时不能说xj 由xi 密度直达, 除非且xi 也是核心对象

  4)密度可达:对于xi和xj,如果存在样本样本序列p1, p2,..., pT,满足p1=xi,pT=xj,且pt+1由pt 密度直达,则称xj 由xi 密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本p1,p2,...,pT?1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出

  5)密度相连:对于xi和xj,如果存在核心对象样本xk,使xi和xj均由xk密度可达,则称xi和xj密度相连。注意密度相连关系是满足对称性的

  如下图所示,对于给定的MinPts=5,红点都是核心对象,黑色的样本点都是非核心对象。

 DBSCAN的核心思想:有密度可达关系导出的最大的密度相连样本集合。即分类簇C必须满足:

  1)连接性:xi∈ C,xj∈ C,可以直接推出xi 与xj 密度相连,同簇内的元素必须满足密度相连

  2)最大性:xi∈ C,xj 有xi 密度可达可以推出xj ∈C 

  DBSCAN算法的具体流程如下:

  1)根据预先给定的(?,MinPts)确定核心对象的集合

  2)从核心对象集合中任选一核心对象,找出由其密度可达的对象生成聚类簇

  3)从核心对象中除掉已选的核心对象和已分配到簇中的核心对象(这说明在一个簇内肯能存在多个核心对象)

  4)重复2,3 步骤,直到所有的核心对象被用完

  DBSACN算法理解起来还是比较简单的,但是也存在一些问题:

  1)在所有的核心对象都被用完之后,可能还是会存在一些样本点没有被分配到任何簇中,此时我们认为这些样本点是异常点

  2)对于有的样本可能会属于多个核心对象,而且这些核心对象不是密度直达的,那么在我们的算法中事实上是采用了先来先到的原则

  与K-means算法相比,DBSCAN算法有两大特点,一是不需要预先设定簇数K的值,二是DBSCAN算法同时适用于凸集和非凸集,而K-means只适用于凸集,在非凸集上可能无法收敛。对于DBSCAN算法适用于稠密的数据或者是非凸集的数据,此时DBSCAB算法的效果要比K-means算法好很多。因此若数据不是稠密的,我们一般不用DBSCAN算法。

  DBSCAN算法的优点:

  1)可以对任意形状的稠密数据进行聚类(包括非凸集)

  2)可以在聚类是发现异常点,对异常点不敏感

  3)聚类结果比较稳定,不会有什么偏倚,而K-means中初始值对结果有很大的影响

  DBSCAN算法的缺点:

  1)样本集密度不均匀时,聚类间距相差很大时,聚类效果不佳

  2)样本集较大时,收敛时间长,可以用KD树进行最近邻的搜索

  3)需要调试的参数比K-means多些,需要去调试? 和MinPts参数(联合调参,不同的组合的结果都不一样)

3、层次聚类和AGNES算法

 层次聚类试图在不同的层次上对数据集进行划分,从而形成树形的聚类结构,数据集的划分可采用 “自底向上”的聚类策略,也可以采用“ 自顶向下” 的策略。在构建树之后,所有的样本都位于叶节点中,叶节点的个数就是簇数。

  AGNES是一种采用自底向上的聚类策略的层次聚类算法。AGNES的核心思想是先将数据集中的每个样本看作一个初始聚类簇,然后每次迭代时找出距离最近的两个簇进行合并,依次迭代知道簇类的个数达到我们指定的个数K为止,这种方法的好处是随着簇类数量的减少,需要计算的距离也会越来越少,而且相对K-means,不需要考虑初始化时随机簇心对模型到来的影响。

  之前讲到的距离计算都是样本之间的计算,那么关于簇与簇之间的距离该如何计算呢,在这里主要有三种计算策略:

  

  

  

  AGNES具体的算法流程如下(数据来源 机器学习-周志华版):

  

  关于层次聚类,除了AGNES算法之外,还有BIRCH算法,BIRCH算法适用于数据量大,簇类K的数量较多的情况下,这种算法只需要遍历一遍数据集既可以完成聚类,运行速度很快。BIRCH算法利用了一个类似于B+树的树结构来帮助我们快速聚类,一般我们将它称为聚类特征数(简称CF Tree),BIRCH算法属于自上向下的层次聚类算法(根据数据集的导入自上而下不断的分裂加层来构建CF 树),CF 树中的每个叶节点就对应着一个簇。因此BIRCH算法事实上就是在构建一颗树,构建完之后,树的叶节点就是对应的簇,叶节点中的样本就是每个簇内的样本。BIRCH适用于大样本集,收敛速度快,且不需要设定簇数K的值,但是要设定树的结构约束值(比如叶节点中样本的个数,内节点中样本的个数),此外BIRCH算法对于数据特征维度很大的样本(比如大于20维)不适合。

  相关解决方案