EM最大指望算法是一个数值求解似然函数极大值的迭代算法,就好像梯度降低算法是一种数值求解损失函数极小值的迭代算法同样。node
EM算法一般适合于随机变量依赖于另一些不可观测的随机变量(称之为隐含变量或者中间变量)的场景。web
此时因为似然函数的表示形式较为复杂(含有对隐含变量的累加求和或者积分),难以求导获取似然函数的极大值,也没法方便地应用梯度降低算法进行优化。算法
而EM算法是一个相似梯度降低算法的迭代算法,它首先给随机变量分布参数赋初始值,而后寻找到了一个便于优化的似然函数的下界 (刚好为似然函数在某个分布下的指望Expectation,指望中消去了隐变量),并经过不断地优化(Maximization) 这个下界求解似然函数的极值。微信
EM算法在机器学习的许多算法中都有使用到,如markdown
-
KMeans:实际上K-Means是一种Hard EM算法, 隐变量直接取最大几率的位置。 -
支持向量机的SMO算法 -
LDA主题模型参数估计 -
混合高斯模型的参数估计 -
HMM隐马尔科夫模型的参数估计
本篇文章咱们将详述EM算法的推导过程,并以一维GMM高斯混合模型为例,示范EM算法的应用方法。机器学习
公众号后台回复关键字:源码,获取本文含所有公式的markdown文件。编辑器
一,EM最大指望算法
当咱们关心的随机变量依赖于另一些不可观测的随机变量时,经过对咱们关心的随机变量采样,咱们将难以直接经过最大似然估计的方法推断咱们关心的随机变量分布律中的未知参数。svg
例如咱们有100个学生的身高数据,其中有一些是男生,另一些是女生。男生和女生的身高服从不一样的正态分布,可是咱们不知道哪些数据是男生的,哪些是女生的,这是这个模型的隐含变量,是不能够被观测到的。函数
那么如何根据这批身高数据估计男女生各自正态分布的均值和方差,以及这批数据中男生的比例呢?学习
指望最大化算法 EM (Expectation Maximization)这时候就派上用场了,它可以解决这种含有隐含随机变量的模型的参数估计的问题。
设观测随机变量为 , 隐含随机变量为 ,待肯定参数为 。
当 和 肯定时, 的分布函数由 给出。
按照极大似然原理,并使用全几率公式,似然函数能够写成
对数似然函数能够写成
对数似然函数中,因为有对 的求和,若是尝试对 求偏导等于0来计算最优的 ,将难以获得对应的解析解。这和目标函数很是复杂时,没法直接解析求解只能使用梯度降低这类迭代算法是同样的。
从原则上说,在一些较为简单的状况下咱们也可以使用梯度降低法求解对数似然的最优值,例如当隐藏变量Z是离散随机变量时,且可取值较少,咱们很容易将对z的求和表示出来,从而能够计算梯度进而使用梯度降低法。
但对于通常状况,对z的求和将难以进行,若是Z是连续的随机变量,对z的求和将变成积分,此时使用梯度降低法将更加困难。
咱们能够尝试和梯度降低算法效果至关的迭代算法。最大指望算法EM正是能够实现这个目的。
大概原理以下,咱们首先给 赋初始值 ,而后在此基础上,找到一个可使得对数似然函数变大的 ,而后再在此基础上找到一个可以使对数似然函数变得更大的 ,如此即可不断地提升对数似然函数的值。迭代执行n干次后,若是 和 的差值足够小,那么咱们认为就找到了比较合适的 做为 的估计值。
下面阐述最大指望算法的原理推导。
假设在第n次迭代,咱们的对数似然函数取值为
咱们但愿找到一个 使得
下面咱们开始寻找符合条件的
构造函数
因为 是严格凹函数,Jensen不等式成立
存在如下缩放:
注意到
所以
取
则有
即符合咱们寻找的条件。
消去无关量,咱们能够获得
注意到 其实是一个分布,所以右边能够理解成求随机变量
在 分布下指望的最大值。
总结下 EM算法算法的流程:
(1) 初始化 。
注意这里的模型参数 要是完备的,即给定这些参数,可以计算联合几率分布函数
,对于男女生混合身高的例子,咱们的参数应当包括 ,即男平生均身高和身高标准差,女平生均身高和身高标准差,以及男生的比例。
(2) 计算E步,又分红两小步,先计算几率分布 ,再算出指望
(3) 对E求极大,解出 的新的估计,将新的估计值代入第(1)步,直到收敛。
能够证实EM算法是收敛的,但不能保证它能收敛到全局最优,所以能够尝试多个不一样的初始值,计算结果,并挑选可以使似然函数取值最大的结果。
二,一维GMM高斯混合模型
高斯分布模型也叫正态分布模型,其几率密度函数以下:
GMM高斯混合模型的几率密度函数为多个高斯分布的线性组合:
其中
为正数,而且:
高斯混合模型的 参数能够理解为样本属于第 类的几率。
则高斯混合模型的几率密度函数能够表示成以下形式:
根据EM算法,
(1)咱们首先取初始化参数
而后执行迭代过程。
(2)咱们先求指望值
代入贝叶斯公式
(3)咱们求指望极大值对应的 做为
考虑到约束
根据拉格朗日乘子法,做拉格朗日函数
取极大值时咱们有:
因而咱们有:
解得:
如此迭代,直到收敛。
本文分享自微信公众号 - Python与算法之美(Python_Ai_Road)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。