前言
最近一直有读者要求我更新相关的机器学习算法,之前更新了马尔可夫链,HMM,随机森林,今天应读者的需求,给大家简单分析和推导一下,GMM的来龙去脉,既然是算法,就避免不了,从数学公式的推导,算法的经典之处,算法的应用场景以及目前的发展现状,每去讨论一个算法,其实是一个非常庞大的工程。对过对自己来说也是一种项目的研究过程。废话不多说,我们首先来看看GMM的来龙去脉。
一、GMM的所属的大家庭
之前小编给大家去列举了一下无监督学习的综述,有需要的您可以参考一下,这样就对GMM又一个所属范畴上的感知:
好好先生:无监督学习|聚类算法综述zhuanlan.zhihu.com我们从大致知道高斯混合模型无监督学习聚类算法的成员,是由近邻算法(AP)的缺点演化,同时它属于概率聚类模型,那么什么是概率聚类模型呢?我们联想到了概率图模型,但是不要混淆了。
那么我们简单总结一下,GMM为什么叫概率类聚类算法。
我们要先了解一下K_means算法,为什么呢?看下去就知道了!
二、Kmeans聚类算法
- 什么是Kmeans算法
- 解决什么问题
- 算法原理是什么
- 核心问题
- 应用的数据集
- 解决不了的问题(缺憾)
- 什么是Kmeans算法?
那么,K-均值到底是什么?嗯,这是一种无监督的学习算法(意味着没有目标标签),它使您可以识别数据中相似的数据点组或群集。
- 解决什么问题?
要了解为什么它有用,请想象上面提到的用例之一,客户细分。使用此算法的公司将能够根据客户的特征将其客户划分为不同的组。千人千面大家肯定听说过。这是从事目标广告、提供诸如个性化折扣、促销之类的东西的非常有用的方式,这很可能会推动收入增长。
- 算法原理是什么?
同样,可以将K均值问题看作是将数据分组为K个聚类,这也是K的含义。其中对聚类的分配基于与质心的某种相似性或距离度量(稍后将对此进行详细介绍)。那么我们该怎么做呢?让我们首先概述涉及的步骤。
- 我们随机初始化K个起始质心。每个数据点都分配给它最近的质心。
- 重心被重新计算为分配给各个群集的数据点的平均值。
- 重复步骤1和2,直到触发停止标准。
原理就是这么简单。现在您可能想知道我们正在优化什么,通常是相似性度量方法:更精确的欧几里德距离或平方欧几里德距离。数据点被分配给最接近它们的簇,或者换句话说,该簇使该平方距离最小。我们可以将其更正式地写为:
公式解释: J只是每个数据点与其分配的簇的距离的平方之和。其中 [R是指示函数等于1,如果数据点(x_n)被分配给该群集(k)和否则为0。什么意思呢?其实就是一共分了K个组,每组有一个随机初始化的质心,计算的距离就是每个数据点n与其所属的组k的距离的平方和,然后我们再把所有的数据距离的平方和相加。这里的Rnk就是一个对应关系的指示函数。相当于之前我们经常看到的指示函数I(x=y)其中只取0或1值。
这里我们就是要找J的最小值问题,我们就不用列代码了,相关的项目也非常多,我们用算法可视化的方法来看看训练的动态过程:
图像解释:
如您所见,上图显示了K均值在起作用。我们定义了k = 2,因此我们在每次迭代时将数据分配给两个集群之一。图(a)对应于随机初始化质心。在(b)中,我们将数据点分配给它们最接近的群集,在图c中,我们将新质心分配为每个群集中数据的平均值。这一直持续到我们达到停止标准为止(最小化成本函数J或预定义的迭代次数)。希望上面的解释以及可视化使您对K的含义有了很好的理解。
- 核心问题
最佳的K值:
使用K均值时,我们需要做的一件事情就是确保选择最佳的聚类数。太少了,我们可能会将具有明显差异的数据分组在一起。簇太多,我们将过度拟合数据,而我们的结果将不能很好地推广。
为了回答这个问题,我们将使用弯头方法,这是用于此任务的常用技术。它涉及使用各种数量的K值聚类估计模型并计算聚类内平方和的负值对于使用sklearn的评分方法选择的每个簇数。请注意,这只是上述目标函数的负数。我们选择的数字是,添加更多聚类只会稍微增加分数。绘制图形时,结果看起来像肘(在这种情况下为上下肘)。簇数的最佳选择是肘部形成的位置。
其实就是我们看到的n_clusters这个超参数的最佳取舍:拐点
number_clusters
- 无法解决的问题
由于,我们采用了随机初始化的方式,聚类中心初始化得不好,直接影响我们最后聚类的效果
现在应该清楚,k均值是一种简单而强大的算法,它对于分析中可能出现的许多不同类型的问题确实非常有用。话虽如此,对于您的特定问题而言,它不一定总是最佳选择,并且在某些假设中,如果要使用该算法,则需要了解该算法。k均值的最大假设和局限性可能是假设聚类是球形的。该假设实质上转化为具有相同方差的所有变量,或者换句话说,是对角线上具有恒定方差的对角协方差矩阵。如果不是这种情况,那么在实践中通常不是这样,那么k均值可能不是最佳解决方案。k-means算法的另一个局限性在于数据点是“硬分配”给集群。换句话说,数据点位于群集中或不在群集中(噪声)。当然,我们对某些数据点相对于其他数据点而言更有信心吗?如果能以某种方式将这种信心纳入我们的结果中会更好吗?
- 应用的数据集
这里我要好好给大家解释一下,这个数据集的假设问题:
K means没有严格的前提要求,但是有一些假设和数据的限制性分布,但是如果数据不符合下面三个要求的话,K means得到的结果可能会比较奇怪:
- 数据中每个变量的方差基本上要一样
- 每一个cluster中每个变量都是近似正态分布(或者众数等于中位数的对称分布)
- 每一个cluster中的元素个数要几乎一样
条件1和2就几乎保证了每个cluster看起来像是球形(而不是椭球形),而且是图的。
为什么条件3也很重要呢,可以看下面这个例子,尽管我们肉眼能看出三个稀疏程度不同的球状簇,但是K means却分成了三个样本数量相似的三个簇
补充说明:
要求数据集是凸数据集,就是数据集内任意两点的连线上所有的点都在数据集内,否则分类效果就很差,这时候DBSCAN就比较合适了:
这里我们不做深入,之后会解释到。
对我们来说幸运的是,还有另一种技术可以用来解决这些问题。我们可以使用称为高斯混合模型或GMM的算法。这样做的好处是我们得到了软分配,即每个数据点都以一定的概率属于每个群集。不仅如此,GMM还对集群的方差做出了较少限制的假设。缺点是它是一个更复杂的算法,这也是我们要讨论的GMM!!
三、GMM高斯模型
- 凸函数
- Jensen's inequality
- EM 演算法(Expectation-Maximization Algorithm)
- 高斯混合模型(Gaussian Mixed Model)
GMM概念
GMM公式怎么来的 - GMM-EM
GMM-EM演算法流程
GMM-EM详细推导
上面我讨论了k-means聚类作为总结文本数据的一种方式。我还谈到了k均值的一些局限性,在什么情况下它可能不是最合适的解决方案。可能的最大限制是每个聚类具有相同的对角协方差矩阵。这样就产生了球状簇,就其可以建模的分布类型而言,它非常不灵活。在本文中,我想解决其中的一些局限性,并特别讨论一种可以避免这些问题的方法,即高斯混合模型(GMM)。接下来的叙述将与上一篇非常相似,我将解释GMM背后的理论及其工作原理。然后,我们可以看到结果与k-means有何不同,以及为什么使用GMM可能是一个很好的选择。
简单来说,GMM也是一种聚类算法。顾名思义,每个聚类都是根据不同的高斯分布建模的。这种对数据建模的灵活且概率性的方法意味着,我们没有像k-means这样的硬分配到聚类中,而是拥有软分配。这意味着每个数据点可能已经由任何分布以相应的概率生成。实际上,每个分布都有一定的“责任”来生成特定的数据点。
我们如何估计这种类型的模型?好吧,我们可以做的一件事就是为每个数据点引入一个潜在变量 (gamma)。这假定是通过使用关于潜在变量的一些信息生成的每个数据点γ。换句话说,它告诉我们哪个高斯生成了特定的数据点。但是实际上,我们没有观察到这些潜在变量,因此我们需要对其进行估计。我们如何做到这一点?好吧,对我们来说幸运的是,在这样的情况下已经有了一种算法,期望最大化(EM)算法,这是我们接下来要讨论的。
开始之前先稍微复习EM会用到的线性代数或是最优化理论的内容:
凸函数
如果f为实数x的函数,二阶微分大于等于0,则f称为凸函数,二阶微分大于0称为严格凸函数。
如果f为向量x的函数,二阶微分矩阵(Hessian Matrix, H)如果是半正定(determinant(H)≥0),则f称j为凸函数,如果determinant(H)>0称为严格凸函数。
Jensen's inequality
机率论观点,如果φ是凸函数,X是随机变量
E: 期望值(expectation),公式如下:
f :是x的概率密度函数。
总结:我们自己去理解这个定理就只用画一个勾和一个倒钩就理解了。
- 对于凸数据集对于样本中任意两个随机变量的连线都不穿过样本。
- 对于凸函数随机变量的期望的函数小于随机变量函数的期望
这是机器学习的概率论基础:
这里给大家一个概率论的学习便签,需要原思维导图的可以在文末获取下载:
手写推导:
这是所有理论推理,包含了很多理论知识和小知识点:
徐亦达机器学习:Expectation Maximization EM算法 ,主要视频推荐:
徐亦达机器学习:Expectation Maximization EM算法 【2015年版-全集】_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.comGMM公式怎么来的
用一种案例来理解:
1.先选一个袋子
这时候选袋子有是一种随机变量,这边假设K个袋子的随机变量这边假设是离散型的,连续型基本上差不多)为
从袋子拿一颗糖果:
先验概率:
αk也就是第k个袋子(高斯分布)被选中的先验机率,或称为每个袋子被挑中的权重。
因此隐藏变数z的概率密度函数为:
假设我们今天选中第k个袋子,然后抽中糖果x发生机率是:
写的比较general一点就是
如果看过后验机率应该知道有一个分母项叫全概率,把所有z可能的概率似然函数乘上先验机率再相加。
其中:
Θ称为高斯混合模型的参数集。
现在我们这个概率模型我把高斯分布写进去替换:
这就是GMM的公式。
α k等于每个高斯分布的界于0到1的权重,然后我们会限定权重和为1。
假设我们已经知道高斯混合模型的参数(Θ)了,此刻我们有一颗糖果x,根据它的后验机率可以推论出来是来自第k个糖果袋子的机率,也可以解读成这个糖果在全部袋子中,第k个袋子将负责多少比例的机率:
此时wk ( x )具有一个特性,全部K个糖果袋子的机率和是1
GMM概率似然函数估计
这边会延续糖果的例子。
假设我们抽了n个糖果,所是事件集合是{ x1,x2,…,xn },我们要用这些糖果来反推论参数,分别是:
听起来就很困难对吧,从抽出来的糖果要去推这么多东西,EM是视乎是一个有效的估计方法。
这边将我们抽了n个糖果的概似函数写出来,然后取对数:
EM是一种不断迭代的算法,所以参数会不断的更新,这边假设
所以:
因为已经在算t+1次,所以第t次的参数Θ(t)固定时,可视为一个常数C不重要可以删除。
我们定义一个函数q:
上述式子可以简化成:
EM算法
EM算法包括两个步骤,E步骤或Expectation步骤以及M步骤或Maximization步骤。比方说,我们有一些潜在变量γ (这是不可观测,并通过下面的矢量Z表示)和我们的数据点X。我们的目标是在给定参数(由矢量θ表示)的情况下,最大化X的边际概率。本质上,我们可以找到作为X和Z的联合的边际概率分布,并求和所有Z的总和(概率总和)。
简化目标函数:
上面的公式通常会导致难以最大化的复杂函数。在这种情况下,我们可以做的是使用Jensens不等式 构造一个下界函数 ,该函数更容易优化。如果我们通过最小化两个分布之间的KL散度 (间隙)来优化此值,则可以近似原始函数。此过程在下面的图1中说明。我还提供了一个视频链接,上面提供了一些想要更严格数学解释的人的KL散度推导。
要从本质上估计我们的模型,我们只需要执行两个步骤。在第一步(E步)中,我们要估计我们的潜在变量的后验分布,其条件取决于我们的权重(π)均值(µ)和高斯变量的协方差(Σ)。参数的向量在图1中表示为θ。估算E步需要首先初始化这些值,我们可以使用k-means进行此操作,这通常是一个很好的起点(有关更多信息,请参见下面的代码)。然后,我们可以转到第二步(M步),并使用 使关于参数θ的可能性最大化。重复此过程,直到算法收敛为止(损失函数不变)。
可视化EM算法
我们在第一步中计算 的后验分布,事实证明它等于通过最小化两个分布之间的KL散度而获得的值。然后,我们将后验概率设置为等于q,并针对参数θ最大化该函数。我们可以从图中看到,当我们迭代并执行这些计算时,我们会朝着最优(或至少是局部最优)迈进。
EM算法的推演这部分我给大家用手写推演一下吧:
EM算法适用于带有隐变量的概率模型的估计,什么是隐变量呢?就是观测不到的变量,对于上面四川人和东北人的例子,对每一个身高而言,它来自四川还是东北,就是一个隐变量。
为什么要用EM,我们来具体考虑一下上面这个问题。如果使用极大似然估计——这是我们最开始最单纯的想法,那么我们需要极大化的似然函数应该是这个:
然而我们并不知道p(x;θ)的表达式,有同学说我知道啊,不就是上面那个混个高斯模型?不就是参数多一点麽。
仔细想想,GMM里的θ可是由四川人和东北人两部分组成哟,假如你要估计四川人的身高均值,直接用GMM做似然函数,会把四川人和东北人全考虑进去,显然不合适。
另一个想法是考虑隐变量,如果我们已经知道哪些样本来自四川,哪些样本来自东北,那就好了。用Z=0或Z=1标记样本来自哪个总体,则Z就是隐变量,需要最大化的似然函数就变为:
然而并没有卵用,因为隐变量确实不知道。要估计一个样本是来自四川还是东北,我们就要有模型参数,要估计模型参数,我们首先要知道一个样本是来自四川或东北的可能性...
到底是鸡生蛋,还是蛋生鸡?
不闹了,我们的方法是假设。首先假设一个模型参数θ,然后每个样本来自四川/东北的概率p(zi)就能算出来了,p(xi,zi)=p(xi|zi)p(zi),而x|z=0服从四川人分布,x|z=1服从东北人分布,所以似然函数可以写成含有θ的函数,极大化它我们可以得到一个新的θ。新的θ因为考虑了样本来自哪个分布,会比原来的更能反应数据规律。有了这个更好的θ我们再对每个样本重新计算它来自四川和东北的概率,用更好的θ算出来的概率会更准确,有了更准确的信息,我们可以继续像上面一样估计θ,自然而然这次得到的θ会比上一次更棒,如此蒸蒸日上,直到收敛(参数变动不明显了),理论上,EM算法就说完了。
然而事情并没有这么简单,上面的思想理论上可行,实践起来不成。主要是因为似然函数有“和的log”这一项,log里面是一个和的形式,一求导这画面不要太美,直接强来你要面对 “两个正态分布的概率密度函数相加”做分母,“两个正态分布分别求导再相加”做分子的分数形式。m个这玩意加起来令它等于0,要求出关于θ的解析解,你对自己的数学水平想的不要太高。
怎么办?先介绍一个不等式,叫Jensen不等式,是这样说的:
X是一个随机变量,f(X)是一个凸函数(二阶导数大或等于0),那么有:
半路杀出一个Jensen不等式,要用它解决上面的困境也是应有之义,不然说它做什么。直接最大化似然函数做不到,那么如果我们能找到似然函数的一个紧的下界一直优化它,并保证每次迭代能够使总的似然函数一直增大,其实也是一样的。怎么说?画个图你就明白了:
横坐标是参数,纵坐标是似然函数,首先我们初始化一个θ1,根据它求似然函数一个紧的下界,也就是图中第一条黑短线,黑短线上的值虽然都小于似然函数的值,但至少有一点可以满足等号(所以称为紧下界),最大化小黑短线我们就hit到至少与似然函数刚好相等的位置,对应的横坐标就是我们的新的θ2,如此进行,只要保证随着θ的更新,每次最大化的小黑短线值都比上次的更大,那么算法收敛,最后就能最大化到似然函数的极大值处。
构造这个小黑短线,就要靠Jensen不等式。注意我们这里的log函数是个凹函数,所以我们使用的Jensen不等式的凹函数版本。根据Jensen函数,需要把log里面的东西写成一个数学期望的形式,注意到log里的和是关于隐变量Z的和,于是自然而然,这个数学期望一定是和Z有关,如果设Q(z)是Z的分布函数,那么可以这样构造:
5. GMM-EM演算法流程:
假设给定样本集合{x1,x2,…,xn}
1.初始化参数
设定K个数,t(第t次计算)设定为0
2. E-step:
假设所有参数(Θ(t))已知,计算:
3. M-step:
利用MLE去估计q (Θ(t),Θ(t+1))的参数Θ(t+1):
参数估计出来为:
4. 重复2~3,直到满足收敛条件(参数收敛或是极大似然函数收敛)
更多详情:
机器学习无监督算法|高斯混合模型(GMM)的来龙去脉,看不懂来找我!当场推导mp.weixin.qq.com参考国外高赞文章:机器学习无监督算法|高斯混合模型(GMM)的来龙去脉,看不懂来找我!当场推导参考国外高赞文章:
Gaussian Mixture Modelling (GMM)
https://towardsdatascience.com/gaussian-mixture-modelling-gmm-833c88587c7ftowardsdatascience.comGMM-EM详细推导
https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-em-%E6%BC%94%E7%AE%97%E6%B3%95-expectation-maximization-algorithm-em-%E9%AB%98%E6%96%AF%E6%B7%B7%E5%90%88%E6%A8%A1%E5%9E%8B-gaussian-mixture-model-gmm-%E5%92%8Cgmm-em%E8%A9%B3%E7%B4%B0%E6%8E%A8%E5%B0%8E-c6f634410483medium.com语音识别-GMM,HMM
https://medium.com/@jonathan_hui/speech-recognition-gmm-hmm-8bb5eff8b196medium.com解锁 Medium 会员文章的浏览器插件:
https://manojvivek.github.io/medium-unlimited/manojvivek.github.ioLink to full code: https://www.kaggle.com/dfoly1/gaussian-mixture-model
Source: Christopher M. Bishop 2006, Pattern Recognition and Machine Learning
Source: Bayesian Methods for Machine Learning: Coursera course
Source: Python for Data Science Handbook