导言

聚类问题是机器学习中无监督学习的典型代表,在数据分析、模式识别的很多实际问题 中得到了应用。在本文中,SIGAI 将为大家深入浅出的介绍聚类问题的定义以及各种典型的 聚类算法,帮助大家建立对聚类算法最直观、本质的概念。

什么是聚类?

我们知道,分类问题是机器学习中最常见的一类问题,它的目标是确定一个物体所属的类别。例如,我们要判定一个水果是苹果、杏,还是桃。解决这类问题的办法是先给一些各种类型的水果让算法学习,然后根据学习得到的经验对一个水果的类型做出判定。这就像一个幼儿园的小朋友,老师先拿各种水果教他们,告诉每种水果是什么样子的,接下来这些孩子就会认这些类型的水果了。这种做法称为有监督学习,它有训练和预测两个过程,在训练阶段,我们用大量的样本进行学习,得到一个判定水果类型的模型。接下来,在预测阶段,给一个水果,就可以用这个模型预测出它的类别,这一过程如下图所示:

常用的聚类算法有哪些(深入浅出聚类算法)(1)

​聚类也是要确定一个物体的类别,但和分类问题不同的是,这里没有事先定义好的类别,聚类算法要自己想办法把一批样本分开,分成多个类,保证每一个类中的样本之间是相似的,而不同类的样本之间是不同的。在这里,类型被称为“簇”(cluster)。以下面的图为例,这里有一堆水果,但我们事先没有告诉你有哪些水果,也没有一个训练好的判定各种水果的模型,聚类算法要自动将这堆水果进行归类:​

常用的聚类算法有哪些(深入浅出聚类算法)(2)

这一次,老师并没有事先告诉孩子们各种水果是什么样子的,孩子们需要自己将水果进行归类划分,而且这些水果可能是他们不认识的。这里没有统一的、确定的划分标准,有些孩子将颜色相似的水果归在了一起,而另外一些孩子将形状相似的水果归在了一起,还有一些孩子将尺寸大小相似的水果归在了一起。

聚类算法没有训练过程,这是和分类算法最本质的区别,算法要根据自己定义的规则,将相似的样本划分在一起,不相似的样本分成不同的类。

问题的严格定义

聚类问题可以抽象成数学中的集合划分问题。假设一个样本集C

常用的聚类算法有哪些(深入浅出聚类算法)(3)

常用的聚类算法有哪些(深入浅出聚类算法)(4)

每个样本只能属于这些子集中的一个,即任意两个子集之间没有交集:

常用的聚类算法有哪些(深入浅出聚类算法)(5)

同一个子集内部的各个样本之间要很相似,不同子集的样本之间要尽量不同。其中m的值可以由人工设定,也可以由算法确定。在这里划分的标准是不确定的,具体什么叫做两个样本很相似,什么叫做不同,并没有统一的答案,需要聚类算法自己决定。例如,如果有下面的样本集:

常用的聚类算法有哪些(深入浅出聚类算法)(6)

我们可以划分成下面的两个子集:

常用的聚类算法有哪些(深入浅出聚类算法)(7)

划分的依据是第一个子集的元素都是奇数,第二个都是偶数。也可以划分成这样:

常用的聚类算法有哪些(深入浅出聚类算法)(8)

这是按照每个数除以3之后的余数进行划分。从这里可以看出,聚类并没有统一的对样本进行划分的标准,可谓是“仁者见仁,智者见智”。

簇的定义

聚类本质上是集合划分问题。因为没有人工定义的类别标准,因此算法要解决的核心问题是如何定义簇,唯一的要求是簇内的样本尽可能相似。通常的做法是根据簇内样本之间的距离,或是样本点在数据空间中的密度来确定。对簇的不同定义可以得到各种不同的聚类算法。常见的聚类算法有:

连通性聚类。典型代表是层次聚类算法,它根据样本之间的联通性来构造簇,所有联通的样本属于同一个簇。

基于质心的聚类。典型代表是k均值算法,它用一个中心向量来表示这个簇,样本所属的簇由它到每个簇的中心距离确定。入下图所示:

常用的聚类算法有哪些(深入浅出聚类算法)(9)

在上图中有蓝色和黄色两个簇,它们由各省的簇中心向量表示(十字形状)。黑色的样本离蓝色的类中心更近,因此被划分到这一类。

基于概率分布的聚类。算法假设每种类型的样本服从同一种概率分布,如多维正态分布,典型代表是EM算法。

基于密度的聚类。典型代表是DBSCAN算法,OPTICS算法,以及均值漂移(Mean shift)算法,它们将簇定义为空间中样本密集的区域。下图中有3个簇,它们都是样本分布密集的区域,对簇的形状则无限制:

常用的聚类算法有哪些(深入浅出聚类算法)(10)

基于图的算法。这类算法用样本点构造出带权重的无向图,每个样本是图中的一个顶点,然后使用图论中的方法完成聚类。

主要的算法

接下来我们介绍几种典型的聚类算法,包括层次聚类,k均值算法,EM算法,DBSCAN算法,OPTICS算法,Mean Shift算法,谱聚类算法。

层次聚类

对于现实生活中的某些问题,类型的划分具有层次结构。如水果分为苹果,杏,梨等,苹果又可以细分成黄元帅、红富士、蛇果等很多品种,杏和梨也是如此。将这种谱系关系画出来,是一棵分层的树。层次聚类使用了这种做法,它反复将样本进行合并,形成一种层次的表示。

初始时每个样本各为一簇,然后开始逐步合并的过程。计算任意两个簇之间的距离,并将聚类最小的两个簇合并。下图是对一堆水果进行层次聚类的示意图:

常用的聚类算法有哪些(深入浅出聚类算法)(11)

算法依赖于两个簇的距离值,因此需要定义它的计算公式。常用的方案可有3种。第一种方案是使用两个簇中任意两个样本之间的距离的最大值,第二种方案是使用两个簇中任意两个样本之间的距离的最小值,第三种方案是使用两个簇中所有样本之间距离的均值。

基于质心的聚类

基于质心的聚类算法计算每个簇的中心向量,以此为依据来确定每个样本所属的类别,典型的代表是k均值算法。

k均值算法是一种被广泛用于实际问题的聚类算法。它将样本划分成个类,参数由人工设定。算法将每个样本划分到离它最近的那个类中心所代表的类,而类中心的确定又依赖于样本的划分方案,这里存在着循环依赖,是一个先有鸡还是先有蛋的问题:

常用的聚类算法有哪些(深入浅出聚类算法)(12)

k均值算法解决此问题的方法是先给给每个簇初始化一个不靠谱的中心向量值,然后计算每个样本离各个簇中心的距离,将其分到最近的那个簇中心所代表的簇。接下来根据对所有样本的分配重新计算每个簇的中心向量,它是该簇所有样本的均值。如此循环,直至收敛,这是一种迭代法。

算法在实现时要考虑下面几个问题:

1.类中心向量的初始值。一般采用随机初始化。最简单的是Forgy算法,它从样本集中随机选择k个样本作为每个类的初始类中心。第二种方案是随机划分,它将所有样本随机的分配给k个类中的一个,然后按照这种分配方案计算各个类的中心向量。

2.参数k的设定。可以根据先验知识人工指定一个值,或者由算法自己确定。

3.迭代终止的判定规则。一般做法是计算本次迭代后的类中心和上一次迭代时的类中心之间的距离,如果小于指定阈值,则算法终止。

k均值算法有多种改进版本,包括模糊c均值聚类,用三角不等式加速等。

基于概率分布的聚类

基于概率分布的聚类算法假设每个簇的样本服从相同的概率分布,这是一种生成模型。经常使用的是多维正态分布,如果服从这种分布,则为高斯混合模型,在求解时一般采用EM算法。

EM算法即期望最大化算法,是一种迭代法,用于聚类问题时,它同时估计出每个样本所属的簇以及每个簇的概率分布的参数。如果要聚类的样本数据服从它所属的簇的概率分布,则可以通过估计每个簇的概率分布以及每个样本所属的簇来完成聚类。估计每个簇概率分布的参数需要知道哪些样本属于这个簇,而确定每个样本属于哪个簇又需要知道每个簇的概率分布的参数,这存在循环依赖。EM算法在每次迭代时交替的解决上面的两个问题,直至收敛到局部最优解。

EM算法是一种迭代法,其目标是求解似然函数或后验概率的极值,而样本中具有无法观测的隐含变量。例如有一批样本分属于3个类,每个类都服从正态分布,均值和协方差未知,并且每个样本属于哪个类也是未知的,需要在这种情况下估计出每个正态分布的均值和协方差。下图是一个例子,3类样本都服从正态分布,但每个样本属于哪个类是未知的:

常用的聚类算法有哪些(深入浅出聚类算法)(13)

样本所属的类别就是隐变量,这种隐变量的存在导致了用最大似然估计求解时的困难。因为隐含变量的存在,我们无法直接通过最大化似然函数得到参数的公式解。可以采用一种策略,构造出对数似然函数的一个下界函数,这个下界函数更容易优化,然后优化这个下界。不断的改变优化变量的值使得下界函数的值升高,从而使得对数似然函数的值也升高,这就是EM算法所采用的思路。在实现时,下界函数的构造利用了Jensen不等式。

基于密度的聚类

基于密度的聚类算法的核心思想是根据样本点某一邻域内的邻居数定义样本空间的密度,这类算法可以找出空间中形状不规则的簇,并且不用指定簇的数量。算法的核心是计算每一点处的密度值,以及根据密度来定义簇。

DBSCAN算法是一种基于密度的算法,对可以有效的处理噪声,发现任意形状的簇。它将簇定义为样本点密集的区域,算法从一个种子样本开始,持续向密集的区域生长,直至到达边界。

常用的聚类算法有哪些(深入浅出聚类算法)(14)

在上图中,从点a开始,先扩展到它的邻居点b,c,d,e,即红色的圆所代表的邻域半径内的点。然后又从点b开始,扩展到它的邻居点a,c,d,f,g,即蓝色的圆所代表的邻域半径内的点,此时a,c,已经被处理过了,直接忽略。然后再从g开始,扩展到它的邻居点b,f,h,即蓝色的圆所代表的邻域半径内的点,此时b,f已经处理过了。如此循环,直到将所有密集的点全部扩展到本簇中,形成蓝色的簇。用同样的方法可以得到黄色的簇,而灰色的点o,p,q则被认为是噪声点。

OPTICS算法是对DBSCAN算法的改进,对参数更不敏感。它不直接生成簇,而是对样本进行排序,从这个排序可以得到各种邻域半径和密度阈值时的聚类结果。

常用的聚类算法有哪些(深入浅出聚类算法)(15)

和DBSCAN算法不同的是,OPTICS在扩展一个簇的时候,总是从最密集的样本开始处理,按照这种顺序对每个样本排序,得到上图中的排序结果。从每个簇的种子节点开始,其后面的点都按照这种样本的密集度指标升序排列。根据这个排序结果可以得到各种参数下的聚类结果。

均值漂移(Mean Shift)算法基于核密度估计技术,是一种寻找概率密度函数极值点的算法。它在聚类分析,图像分割,视觉目标跟踪中都有应用。在用于聚类任务时,它寻找概率密度函数的极大值点,即样本分布最密集的位置,以此得到簇。

常用的聚类算法有哪些(深入浅出聚类算法)(16)

对于某些应用,我们不知道概率密度函数的具体形式,但有一组采样自此分布的离散样本数据,核密度估计可以根据这些样本值估计概率密度函数,均值漂移算法可以找到概率密度函数的极大值点。和之前介绍的数值优化算法一样,这也是一种迭代算法,从一个初始点开始,按照某种规则移动到下一点,直到到达极值点处。找到了所有极值点,就找到了所有的簇。

基于图的聚类

基于图的算法把样本数据看作图的顶点,根据数据点之间的距离构造边,形成带权重的图。通过图的切割实现聚类,即将图切分成多个子图,这些子图就是对应的簇。这类算法的典型代表是谱聚类算法。谱聚类算法首先构造样本集的邻接图,得到图的拉普拉斯矩阵,图的拉普拉斯矩阵在SIGAI之前的公众号文章“流形学习概述”中已经介绍。接下来对矩阵进行特征值分解,通过对特征向量进行处理构造出簇。

算法首先根据样本集构造出带权重的图G,聚类算法的目标是将其切割成多个子图。假设图的顶点集合为V,边的集合为E。聚类算法将顶点集合切分成k个子集,它们的并集是整个顶点集:

常用的聚类算法有哪些(深入浅出聚类算法)(17)

​任意两个子集之间的交集为空:

常用的聚类算法有哪些(深入浅出聚类算法)(18)

对于任意两个子图,其的顶点集合为A和B,它们之间的切图权重定义为连接两个子图节点的所有边的权重之和:

常用的聚类算法有哪些(深入浅出聚类算法)(19)

这可以看做两个子图之间的关联程度,如果两个子图之间没有边连接,则这个值为0。从另一个角度看,这是对图进行切割时去掉的边的权重之和。对图顶点的子集V1 ,...,Vk,定义这种分割的代价为:

常用的聚类算法有哪些(深入浅出聚类算法)(20)

常用的聚类算法有哪些(深入浅出聚类算法)(21)

这个值与聚类的目标一致,即每个子图内部的连接很强,而子图之间的连接很弱。下图为图切割示意图,将一个图切分成3个子图,分别为红色,黄色和蓝色,虚线边为切掉的边,它们的权重之和即为切图成本:

常用的聚类算法有哪些(深入浅出聚类算法)(22)

但直接通过最小化这个值完成聚类还有问题,它没有考虑子图规模对代价函数的影响,使得这个指标最小的切分方案不一定就是最优切割。

解决这个问题的方法是对代价函数进行归一化。第一种方法是用图的顶点数进行归一化,由此得到优化的目标为:

常用的聚类算法有哪些(深入浅出聚类算法)(23)

其中|Vi |为子集的元素数量。最后归结为求解矩阵的特征值和特征向量问题。另外一种方案也采用了归一化项:

常用的聚类算法有哪些(深入浅出聚类算法)(24)

其中vol是图中所有顶点的加权度之和:

常用的聚类算法有哪些(深入浅出聚类算法)(25)

求解上面的最优化问题,即可得到图的最佳切分方案,也就是我们想要的聚类结果。已经证明,求上面的最优化问题的解等价于求解图的归一化的拉普拉斯矩阵的特征值问题。

推荐阅读

[1]机器学习-波澜壮阔40年【获取码】SIGAI0413.

[2]学好机器学习需要哪些数学知识?【获取码】SIGAI0417.

[3] 人脸识别算法演化史【获取码】SIGAI0420.

[4]基于深度学习的目标检测算法综述 【获取码】SIGAI0424.

[5]卷积神经网络为什么能够称霸计算机视觉领域?【获取码】SIGAI0426.

[6] 用一张图理解SVM的脉络【获取码】SIGAI0428.

[7] 人脸检测算法综述【获取码】SIGAI0503.

[8] 理解神经网络的激活函数 【获取码】SIGAI2018.5.5.

[9] 深度卷积神经网络演化历史及结构改进脉络-40页长文全面解读【获取码】SIGAI0508.

[10] 理解梯度下降法【获取码】SIGAI0511.

[11] 循环神经网络综述—语音识别与自然语言处理的利器【获取码】SIGAI0515

[12] 理解凸优化 【获取码】 SIGAI0518

[13] 【实验】理解SVM的核函数和参数 【获取码】SIGAI0522

[14]【SIGAI综述】行人检测算法 【获取码】SIGAI0525

[15] 机器学习在自动驾驶中的应用—以百度阿波罗平台为例(上)【获取码】SIGAI0529

[16]理解牛顿法【获取码】SIGAI0531

[17] 【群话题精华】5月集锦—机器学习和深度学习中一些值得思考的问题【获取码】SIGAI 0601

[18] 大话Adaboost算法 【获取码】SIGAI0602

[19] FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法【获取码】SIGAI0604

[20] 理解主成分分析(PCA)【获取码】SIGAI0606

[21] 人体骨骼关键点检测综述 【获取码】SIGAI0608

[22]理解决策树 【获取码】SIGAI0611

[23] 用一句话总结常用的机器学习算法【获取码】SIGAI0611

[24] 目标检测算法之YOLO 【获取码】SIGAI0615

[25] 理解过拟合 【获取码】SIGAI0618

[26]理解计算:从√2到AlphaGo ——第1季 从√2谈起 【获取码】SIGAI0620

[27] 场景文本检测——CTPN算法介绍 【获取码】SIGAI0622

[28] 卷积神经网络的压缩和加速 【获取码】SIGAI0625

[29] k近邻算法 【获取码】SIGAI0627

[30]自然场景文本检测识别技术综述 【获取码】SIGAI0627

[31] 理解计算:从√2到AlphaGo ——第2季 神经计算的历史背景 【获取码】SIGAI0704

[32] 机器学习算法地图【获取码】SIGAI0706

[33] 反向传播算法推导-全连接神经网络【获取码】SIGAI0709

[34] 生成式对抗网络模型综述【获取码】SIGAI0709.

[35]怎样成为一名优秀的算法工程师【获取码】SIGAI0711.

[36] 理解计算:从根号2到AlphaGo——第三季 神经网络的数学模型【获取码】SIGAI0716

[37]【技术短文】人脸检测算法之S3FD 【获取码】SIGAI0716

[38] 基于深度负相关学习的人群计数方法【获取码】SIGAI0718

[39] 流形学习概述【获取码】SIGAI0723

[40] 关于感受野的总结 【获取码】SIGAI0723

[41] 随机森林概述 【获取码】SIGAI0725

[42] 基于内容的图像检索技术综述——传统经典方法【获取码】SIGAI0727

[43] 神经网络的激活函数总结【获取码】SIGAI0730

[44] 机器学习和深度学习中值得弄清楚的一些问题【获取码】SIGAI0802

[45] 基于深度神经网络的自动问答系统概述【获取码】SIGAI0803

[46] 反向传播算法推导——卷积神经网络 【获取码】SIGAI0806

[47] 机器学习与深度学习核心知识点总结 写在校园招聘即将开始时 【获取 码】SIGAI0808

[48] 理解Spatial Transformer Networks【获取码】SIGAI0810

[49]AI时代大点兵-国内外知名AI公司2018年最新盘点【获取码】SIGAI0813

[50] 理解计算:从√2到AlphaGo ——第2季 神经计算的历史背景 【获取码】SIGAI0815

[51] 基于内容的图像检索技术综述--CNN方法 【获取码】SIGAI0817

[52]文本表示简介 【获取码】SIGAI0820

[53]机器学习中的最优化算法总结【获取码】SIGAI0822

[54]【AI就业面面观】如何选择适合自己的舞台?【获取码】SIGAI0823

[55]浓缩就是精华-SIGAI机器学习蓝宝书【获取码】SIGAI0824

[56]DenseNet详解【获取码】SIGAI0827

[57]AI时代大点兵国内外知名AI公司2018年最新盘点【完整版】【获取码】SIGAI0829

[58]理解Adaboost算法【获取码】SIGAI0831

原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不能用于商业目的

,