数据聚类(一)常见聚类算法的基本原理[图解]
相关名词的英文翻译
机器学习的一种常见划分方式如下
训练数据有标签,使机器根据已有的示例进行学习,如分类和回归
【无监督学习】
训练数据无标签,机器根据数据性质自主进行学习,如聚类
【半监督学习】
训练时使用大量未标记数据及一部分标记数据,充分利用未标记样本来提升模型的泛化能力
【强化学习】
在学习过程中不断收到环境的反馈,最佳的行为由环境的正回报来强化,强化学习的典型代表为 AlphaGo
聚类任务是一种无监督学习,通过聚类将数据集中的样本划分为若干子集(“簇”),每个簇可能对应于一些潜在的概念和类别。之所以说是“潜在”,是因为聚类得到的划分结果是事先未知的,因此通过聚类任务,可以发掘数据内在的分布结构,探究数据样本之间的潜在联系。
现在有一个任务,把下面六个点分成两类:
首先选择两个点作为初始中心(x1和x2)
分别计算剩下的四个点到两个初始中心的距离,选择距离较近的一个初始中心,归为一类
第1次迭代完成,六个样本被分成了两类{x1,x3,x5}(黄色)和{x2,x4,x6}(蓝色),然后对于划分好的两类,重新计算每一类的均值,如红色点1和2所示
开始第2次迭代,计算每个样本点到两个新均值的距离,选择距离较近的一个中心归为一类
第2次迭代结束之后,六个样本被重新分成了两类{x1,x3,x5,x6}(黄色)和{x2,x4 }(蓝色),重新计算每一类的均值,如红色点1和2所示。
判断这次迭代得到的中心点与上次迭代的结果是否有更新,若有变动,则继续上述过程,计算每个样本点到两个中心的距离,生成新的簇划分,再计算新的簇中心……依次循环,直至各个簇的中心点不再更新,得到最终的聚类结果。
注:上述过程给出的距离划分结果仅用作演示说明算法的流程,并非严格按照背景方格纸的刻度进行计算得出。
-
在样本集中随机选择k个样本作为每个簇初始的均值; -
重复步骤3-5,直至每个簇的均值不再更新; -
计算样本集中每个样本到各个簇均值向量的距离,将该样本划分到距离该样本最近的均值向量所对应的簇; -
一次划分完成后重新计算每一簇的均值; -
查看均值向量是否更新。
给定样本集
k均值算法针对聚类所得的簇划分最小化平方误差
其中
表示第i簇的均值向量。E在一定程度上刻画了簇内样本围绕簇均值向量的紧密程度,求解簇划分的过程即为最小化上述E值的过程。但直接求解E的最小值需要考察样本集D内所有可能的簇划分,这是一个NP难问题。因此在k均值算法的实际求解中,采用了贪心策略,通过迭代更新当前的簇划分及均值向量进行近似求解。
K-Means是用每个聚类中的均值(mean)做中心点,K-Modes是用每个聚类中的众数(mode)做中心点。通常K-Means较多使用欧式距离,而K-Modes一般是汉明距离,也就是对于每个特征来说,如果不同记为1,相同则为0。
K-prototype则是K-means与K-modes的一种结合形式。
K-modes算法的适用情形:对于非数值集合上的聚类任务,我们通常会采用K-modes算法,将原本K-means使用的欧式距离替换成字符间的汉明距离。
K-prototype算法的适用情形:适用于数值类型与字符类型结合的数据。
在此给出算法复现的结果,直观地对混合高斯模型在聚类中的应用进行理解。图中实线是数据对应的真实的高斯分布,虚线是估计的高斯分布,从迭代过程可以看出,高斯分布的参数不断更新,最终估计出的高斯分布与实际值几乎完全重合。
-
模型参数初始化; -
重复步骤3-4,直到对数似然函数不再有明显的变化,或者达到迭代次数上限; -
E步:更新W及P,其中W是隐变量,即每个样本属于每一簇的后验概率,P为聚类每一簇所占的比重,即混合系数; -
M步:更新高斯分布的均值和方差; -
根据W的值得到每个样本对应的簇标记,完成簇划分。
K-Means算法可以看做是高斯混合聚类的一个特例,它的各混合成分方差相等,且每个样本仅指派一个混合成分。
同样可以使用EM算法对K-means算法进行推导:K-means中每个样本所属的类就可以看成是一个隐变量,在E步中,我们固定每个类的中心,通过对每一个样本选择最近的类优化目标函数;在M步,重新更新每个类的中心点,该步骤可以通过对目标函数求导实现,最终可得新的类中心就是类中样本的均值。
对高斯混合聚类过程的深入了解需要理解EM算法的原理,后面会对其数学推导另做整理。
理解DBSCAN算法首先要理解以下几个概念:
-
ε邻域 :首先我们需要设定一个邻域参数ε(即下图中的 max_dis ),样本 x 的ε邻域包含了样本集中所有与该样本距离小于ε的样本。 例如下图中的两个红色区域,分别表示样本x1和x3的ε邻域。 -
核心对象 :我们需要设定一个 MinPts 参数,当样本 x 的ε邻域内样本数大于等于 MinPts 个时,我们将 x 称为一个核心对象。 在下图中,假设MinPts=3,则我们可以将x1看做一个核心对象,其ε邻域内包含了三个样本{x1,x2,x5} -
密度直达 :假设有两个样本 xi 和 xj ,如果 xj 位于 xi 的ε邻域中,并且 xi 是核心对象,那么我们称 xj 由 xi 密度直达。 在下图中,x2位于x1的ε邻域内,且x1是核心对象,所以我们可以说x2可由x1密度直达。 -
密度可达 :对 xi 与 xj ,若存在样本序列 p1,p2,p3,...pn ,其中 p1=x1,pn=xj ,且 pi+1 由 pi 密度直达,则称 xi 与 xj 密度可达。 在下图中,x2可由x1密度直达,x3可由x2密度直达,所以我们认为x1和x3是密度可达的。
基于上面的几种概念,给出DBSCAN算法的基本流程:
【输入】样本集和邻域参数,其中邻域参数包括判断为领域内样本的最大距离max_dis、样本被看作核心对象的最小邻域内样本数量min_pts
【过程】
根据邻域参数max_dis确定每个样本的邻域,统计邻域内样本个数
根据邻域参数min_pts生成核心对象集合
重复步骤4-5直至核心对象集合为空
随机选取一个核心对象,找到这个核心对象的所有密度可达的样本,构成一个聚类簇
在核心对象集合中去除包含在该聚类簇中的样本
【输出】簇划分结果
生成一组模拟数据用于聚类,数据分布如下:
设定两个邻域参数,找出核心对象集合(下图中红色点)
随机选取一个核心对象,找到这个核心对象的所有密度可达的样本,构成一个聚类簇。(图中红色点表示选取的核心对象),重复该过程直至核心对象集合为空
检测到核心样本集合为空,停止聚类,得到最终的聚类结果。
AGNES算法是一种常见的层次聚类算法,它采用自底向上的聚合策略,该算法的原理非常简单:先将数据集中的每个样本看作一个初始聚类簇,然后在算法运行的每一步中找出距离最近的两个聚类簇进行合并,直到达到预设的聚类簇个数为止。
在算法复现过程中,为了方便进行聚类簇合并及层次遍历操作,可以选择借助二叉树进行该过程的模拟。
随着聚类的进行,每一步都有两个簇被归并为一个新的簇,显然这种方式有助于发现各个簇之间的层次关系,并能够对最适用的聚类数目进行探索。但是,每个步骤都需要完成当前所有簇两两之间距离的计算,该算法的复杂度非常高。
【输入】样本集及聚类簇数
【过程】
-
将每个样本设置为一个初始聚类簇 -
重复步骤 3-4 直至当前聚类簇的个数与预设的聚类簇数相等 -
找到距离最近的两个聚类簇 -
合并两个聚类簇
算法由将每个样本作为一个簇开始执行,每一步合并两个簇,当算法执行到聚成7个簇时,在模拟数据上的聚类结果如下图:
接下来,黄色和紫色的两个簇进行了合并,聚成6类
接下来,蓝色和红色的两个簇进行了合并,聚成5类
以此类推,聚成4类时:
聚成3类时:
除了上面介绍的几种聚类算法外,还有一种比较特殊的聚类算法,它属于“监督学习”的范畴,学习向量量化聚类方法的每个样例均有类别标签。该算法的输出是一组原型向量,每个原型向量定义了与之相关的一个区域,区域中每个样本与自身类别的原型向量的距离不大于它与其他原型向量的距离。
该算法实现的流程如下,不断调整原型向量使其对样本空间的划分更符合实际的类别标签划分:
【输入】样本集,聚类个数,原型向量预设类别标记,学习率
【过程】
-
选取一组样本作为初始原型向量(可以按照类别标记分别选取); -
重复步骤 3-5 ,直到达到最大迭代次数,或原型向量更新很小甚至不再更新; -
在样本集内随机选取一个样本; -
计算该样本与每个原型向量的距离,找到距离最近的原型向量; -
如果该样本与该原型向量的类别标记相同,则调整原型向量的位置靠近该样本;若类别标记不同,则调整原型向量的位置远离该样本。
【输出】一组原型向量
通过聚类的过程来直观地理解原型向量如何对样本空间进行切分:
生成如下所示的模拟数据,进行LVQ聚类。
给定样本集
每个样本xj是由个n属性描述的特征向量
yj是样本的类别标记。LVQ的目标是学得一组n维的原型向量
每个原型向量代表了一个聚类簇。对于样本空间X,学习到一组原型向量后,每个样本x将被划入与其距离最近的原型向量所代表的簇中:
式中每个原型向量pi定义了一个与之相关的区域Ri,该区域中的每个样本与pi的距离不大于它与其他原型向量的距离。由此形成的样本空间X的簇划分
称为“Voronoi剖分”。