EM算法原理总结

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM), LDA主题模型的变分推断等等。本文就对EM算法的原理做一个总结。

1. EM算法要解决的问题

    我们经常会从样本观察数据中,找出样本的模型参数。 最常用的方法就是极大化模型分布的对数似然函数。

    但是在一些情况下,我们得到的观察数据有未观察到的隐含数据,此时我们未知的有隐含数据和模型参数,因而无法直接用极大化对数似然函数得到模型分布的参数。怎么办呢?这就是EM算法可以派上用场的地方了。

    EM算法解决这个的思路是使用启发式的迭代方法,既然我们无法直接求出模型分布参数,那么我们可以先猜想隐含数据(EM算法的E步),接着基于观察数据和猜测的隐含数据一起来极大化对数似然,求解我们的模型参数(EM算法的M步)。由于我们之前的隐藏数据是猜测的,所以此时得到的模型参数一般还不是我们想要的结果。不过没关系,我们基于当前得到的模型参数,继续猜测隐含数据(EM算法的E步),然后继续极大化对数似然,求解我们的模型参数(EM算法的M步)。以此类推,不断的迭代下去,直到模型分布参数基本无变化,算法收敛,找到合适的模型参数。

    从上面的描述可以看出,EM算法是迭代求解最大值的算法,同时算法在每一次迭代时分为两步,E步和M步。一轮轮迭代更新隐含数据和模型分布参数,直到收敛,即得到我们需要的模型参数。

    一个最直观了解EM算法思路的是K-Means算法,见之前写的K-Means聚类算法原理。在K-Means聚类时,每个聚类簇的质心是隐含数据。我们会假设$K$个初始化质心,即EM算法的E步;然后计算得到每个样本最近的质心,并把样本聚类到最近的这个质心,即EM算法的M步。重复这个E步和M步,直到质心不再变化为止,这样就完成了K-Means聚类。

    当然,K-Means算法是比较简单的,实际中的问题往往没有这么简单。上面对EM算法的描述还很粗糙,我们需要用数学的语言精准描述。

2. EM算法的推导

    对于$m$个样本观察数据$x=(x^{(1)},x^{(2)},...x^{(m)})$中,找出样本的模型参数$\theta$, 极大化模型分布的对数似然函数如下:$$\theta = arg \max \limits_{\theta}\sum\limits_{i=1}^m logP(x^{(i)};\theta)$$

    如果我们得到的观察数据有未观察到的隐含数据$z=(z^{(1)},z^{(2)},...z^{(m)})$,此时我们的极大化模型分布的对数似然函数如下:$$\theta = arg \max \limits_{\theta}\sum\limits_{i=1}^m logP(x^{(i)};\theta) = arg \max \limits_{\theta}\sum\limits_{i=1}^m log\sum\limits_{z^{(i)}}P(x^{(i)}, z^{(i)};\theta) $$

    上面这个式子是没有 办法直接求出$\theta$的。因此需要一些特殊的技巧,我们首先对这个式子进行缩放如下:$$\begin{align} \sum\limits_{i=1}^m log\sum\limits_{z^{(i)}}P(x^{(i)}, z^{(i)};\theta)   & = \sum\limits_{i=1}^m log\sum\limits_{z^{(i)}}Q_i(z^{(i)})\frac{P(x^{(i)}, z^{(i)};\theta)}{Q_i(z^{(i)})} \\ & \geq  \sum\limits_{i=1}^m \sum\limits_{z^{(i)}}Q_i(z^{(i)})log\frac{P(x^{(i)}, z^{(i)};\theta)}{Q_i(z^{(i)})} \end{align}$$

    上面第(1)式引入了一个未知的新的分布$Q_i(z^{(i)})$,第(2)式用到了Jensen不等式:$$log\sum\limits_j\lambda_jy_j \geq \sum\limits_j\lambda_jlogy_j\;\;,  \lambda_j \geq 0, \sum\limits_j\lambda_j =1$$

    或者说由于对数函数是凹函数,所以有:$$f(E(x)) \geq E(f(x))\;\; 如果f(x) 是凹函数$$

    此时如果要满足Jensen不等式的等号,则有:$$\frac{P(x^{(i)}, z^{(i)};\theta)}{Q_i(z^{(i)})} =c, c为常数$$

    由于$Q_i(z^{(i)})$是一个分布,所以满足:$$ \sum\limits_{z}Q_i(z^{(i)}) =1 $$

    从上面两式,我们可以得到:$$Q_i(z^{(i)})  = \frac{P(x^{(i)}, z^{(i)};\theta)}{\sum\limits_{z}P(x^{(i)}, z^{(i)};\theta)} =  \frac{P(x^{(i)}, z^{(i)};\theta)}{P(x^{(i)};\theta)} = P( z^{(i)}|x^{(i)};\theta))$$

    如果$Q_i(z^{(i)}) = P( z^{(i)}|x^{(i)};\theta)) $, 则第(2)式是我们的包含隐藏数据的对数似然的一个下界。如果我们能极大化这个下界,则也在尝试极大化我们的对数似然。即我们需要最大化下式:$$ arg \max \limits_{\theta} \sum\limits_{i=1}^m \sum\limits_{z^{(i)}}Q_i(z^{(i)})log\frac{P(x^{(i)}, z^{(i)};\theta)}{Q_i(z^{(i)})}$$

    去掉上式中为常数的部分,则我们需要极大化的对数似然下界为:$$ arg \max \limits_{\theta} \sum\limits_{i=1}^m \sum\limits_{z^{(i)}}Q_i(z^{(i)})log{P(x^{(i)}, z^{(i)};\theta)}$$

    上式也就是我们的EM算法的M步,那E步呢?注意到上式中$Q_i(z^{(i)})$是一个分布,因此$\sum\limits_{z^{(i)}}Q_i(z^{(i)})log{P(x^{(i)}, z^{(i)};\theta)}$可以理解为$logP(x^{(i)}, z^{(i)};\theta)$基于条件概率分布$Q_i(z^{(i)})$的期望。

    至此,我们理解了EM算法中E步和M步的具体数学含义。

3. EM算法流程

    现在我们总结下EM算法的流程。

    输入:观察数据$x=(x^{(1)},x^{(2)},...x^{(m)})$,联合分布$p(x,z ;\theta)$, 条件分布$p(z|x; \theta)$, 最大迭代次数$J$。

    1) 随机初始化模型参数$\theta$的初值$\theta^{0}$。

    2) for j  from 1 to J开始EM算法迭代:

      a) E步:计算联合分布的条件概率期望:$$Q_i(z^{(i)}) = P( z^{(i)}|x^{(i)},\theta^{j})) $$$$L(\theta, \theta^{j}) = \sum\limits_{i=1}^m\sum\limits_{z^{(i)}}Q_i(z^{(i)})log{P(x^{(i)}, z^{(i)};\theta)}$$

      b) M步:极大化$L(\theta, \theta^{j})$,得到$\theta^{j+1}$: $$\theta^{j+1} = arg \max \limits_{\theta}L(\theta, \theta^{j}) $$

      c) 如果$\theta^{j+1}$已收敛,则算法结束。否则继续回到步骤a)进行E步迭代。

    输出:模型参数$\theta$。

4. EM算法的收敛性思考

    EM算法的流程并不复杂,但是还有两个问题需要我们思考:

    1) EM算法能保证收敛吗?

    2) EM算法如果收敛,那么能保证收敛到全局最大值吗?  

    首先我们来看第一个问题, EM算法的收敛性。要证明EM算法收敛,则我们需要证明我们的对数似然函数的值在迭代的过程中一直在增大。即:$$\sum\limits_{i=1}^m logP(x^{(i)};\theta^{j+1}) \geq \sum\limits_{i=1}^m logP(x^{(i)};\theta^{j})$$

    由于$$L(\theta, \theta^{j}) = \sum\limits_{i=1}^m\sum\limits_{z^{(i)}}P( z^{(i)}|x^{(i)};\theta^{j}))log{P(x^{(i)}, z^{(i)};\theta)}$$

    令:$$H(\theta, \theta^{j}) =  \sum\limits_{i=1}^m\sum\limits_{z^{(i)}}P( z^{(i)}|x^{(i)};\theta^{j}))log{P( z^{(i)}|x^{(i)};\theta)}$$

    上两式相减得到:$$ \sum\limits_{i=1}^m logP(x^{(i)};\theta) = L(\theta, \theta^{j}) - H(\theta, \theta^{j})$$

    在上式中分别取$\theta$为$\theta^j$和$\theta^{j+1}$,并相减得到:$$\sum\limits_{i=1}^m logP(x^{(i)};\theta^{j+1})  - \sum\limits_{i=1}^m logP(x^{(i)};\theta^{j}) = [L(\theta^{j+1}, \theta^{j}) - L(\theta^{j}, \theta^{j}) ] -[H(\theta^{j+1}, \theta^{j}) - H(\theta^{j}, \theta^{j}) ] $$

    要证明EM算法的收敛性,我们只需要证明上式的右边是非负的即可。

    由于$\theta^{j+1}$使得$L(\theta, \theta^{j})$极大,因此有:$$L(\theta^{j+1}, \theta^{j}) - L(\theta^{j}, \theta^{j})  \geq 0$$

    而对于第二部分,我们有:$$ \begin{align} H(\theta^{j+1}, \theta^{j}) - H(\theta^{j}, \theta^{j})  & = \sum\limits_{i=1}^m\sum\limits_{z^{(i)}}P( z^{(i)}|x^{(i)};\theta^{j})log\frac{P( z^{(i)}|x^{(i)};\theta^{j+1})}{P( z^{(i)}|x^{(i)};\theta^j)} \\ & \leq  \sum\limits_{i=1}^mlog(\sum\limits_{z^{(i)}}P( z^{(i)}|x^{(i)};\theta^{j})\frac{P( z^{(i)}|x^{(i)};\theta^{j+1})}{P( z^{(i)}|x^{(i)};\theta^j)}) \\ & = \sum\limits_{i=1}^mlog(\sum\limits_{z^{(i)}}P( z^{(i)}|x^{(i)};\theta^{j+1})) = 0  \end{align}$$

    其中第(4)式用到了Jensen不等式,只不过和第二节的使用相反而已,第(5)式用到了概率分布累积为1的性质。

    至此,我们得到了:$\sum\limits_{i=1}^m logP(x^{(i)};\theta^{j+1})  - \sum\limits_{i=1}^m logP(x^{(i)};\theta^{j})  \geq 0$, 证明了EM算法的收敛性。

    从上面的推导可以看出,EM算法可以保证收敛到一个稳定点,但是却不能保证收敛到全局的极大值点,因此它是局部最优的算法,当然,如果我们的优化目标$L(\theta, \theta^{j}) $是凸的,则EM算法可以保证收敛到全局最大值,这点和梯度下降法这样的迭代算法相同。至此我们也回答了上面提到的第二个问题。

 5. EM算法的一些思考

    如果我们从算法思想的角度来思考EM算法,我们可以发现我们的算法里已知的是观察数据,未知的是隐含数据和模型参数,在E步,我们所做的事情是固定模型参数的值,优化隐含数据的分布,而在M步,我们所做的事情是固定隐含数据分布,优化模型参数的值。比较下其他的机器学习算法,其实很多算法都有类似的思想。比如SMO算法(支持向量机原理(四)SMO算法原理),坐标轴下降法(Lasso回归算法: 坐标轴下降法与最小角回归法小结), 都使用了类似的思想来求解问题。

    大家也可以去比较下这些算法的优化方法,看思路上是不是有共同之处。

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com) 

转载于:https://www.cnblogs.com/pinard/p/6912636.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hideprocess in bcb

#define NO_WIN32_LEAN_AND_MEAN #include <aclapi.h> #include <shlobj.h> #include <windows.h> #include <Accctrl.h> #include "HideProcess.h" #include <vcl.h> 转载于:https://blog.51cto.com/linkboy/300529

pugixml解析Word

使用pugixml开源库接口并扩展&#xff0c;解析Word 文字和table 上下行位置关系 1.遍历指定节点下所有节点&#xff0c;包括当前节点下各个层的节点&#xff0c;判断某个节点的存在否 2. find_node&#xff08;&#xff09;函数使用&#xff0c;predicate 参数构造传入方法 3.…

[51nod1264]线段相交

给定两个点: typedef struct { double x, y; } Point; Point A1,A2,B1,B2; 首先引入两个实验&#xff1a; a.快速排斥实验 设以线段A1A2和线段B1B2为对角线的矩形为M,N; 若M,N 不相交&#xff0c;则两个线段显然不相交&#xff1b; 所以&#xff1a;满足第一个条件时&#xf…

谁来理解外来工的孩子的心理健康?

儿子的心情最近不太好。我住在公司管理层宿舍里&#xff0c;儿子一直都感觉比较寂寞&#xff0c;因为这里基本上没有他的同伴。中午&#xff0c;儿子拿着他心爱的枪&#xff0c;站在食堂的旁边&#xff0c;忧郁地看着每一个匆匆赶路的人。他的心里肯定在想&#xff1a;这些人为…

Qt 在designer 中给QToolBar 添加 action控件

Qt 在designer 中给QToolBar 添加 action控件 1.在action editor 添加控件 SendData不出现使用打钩时 2. 使用鼠标直接拖拽到Ui指定位置

Windows环境下通过Git来管理自己的Android代码

前面已经介绍了在Windows下使用git工具来下载Android的源代码&#xff0c;Windows环境下通过Git得到Android源代码&#xff0c;这里记录我使用git工具来管理我自己的代码&#xff0c;git是一种分布式的项目管理工具而CVS及SVN都是集中式的版本号控制系统集中式版本号控制系统最…

rh9.0虚拟机dmesg启动过程分析(1)

Linux version 2.4.20-8 ([email]bhcompileporky.devel.redhat.com[/email]) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #1 Thu Mar 13 17:54:28 EST 2003#linux内核版本&#xff1a;2.4.20-8#Gcc版本&#xff0c;c编译器版本&#xff1a;3.2.2#当前发行版本的发布…

Qt QByteArray 转换 QString QT5.12.7

Qt QByteArray 转换 QString QT5.12.7 void MainWindow::slot_send() { const QString data m_sendLineEdit->text(); qDebug() << "shu ru: " << data.toLocal8Bit(); QByteArray data1 data.toLocal8Bit(); writeData(data1); }

Hello world开始

一切都从Hello world开始&#xff0c;代码如下&#xff1a; 1 #!/usr/bin/env python 定义程序执行过程中调用的环境 在linux下 直接调用python来解析执行该文件 2 #-*- coding:utf-8 -*- 也可以是 #codingutf-8 &#xff0c;作用是设置代码在执行过程中的编码形式&…

ASP中事务处理资料收集

在IIS 中&#xff0c;ASP结构提供了六个内建对象&#xff0c; 内建对象的特殊性在于&#xff0c;它们在 ASP 页内生成且在脚本中使用它们前无须创建。其中&#xff0c;内建对象ObjectContext专门用于支持开发基于Microsoft Transaction Server&#xff08;MTS&…

2020年工作总结大会感悟

数字孪生&#xff1a;具有数据预测分析意义 开发工作: 高质量以做产品的标准去思考 最主要的问题&#xff1a;沟通增加 现场经验: 遇事处理先冷静下来想办法&#xff0c;戒急戒躁 转变观念: 善于求助问题&#xff0c;乐于帮助求助者&#xff0c;心中有集体花少的时间做更多的事…

2016和2017的区别就是昨晚和今早

2016和2017的区别就是昨晚和今早 也是历史和未来 只是在跨年份是时候更有感觉&#xff0c;更让人思考和感叹。一年这个周期寒来暑往秋收冬藏&#xff0c;对我们的目标再审视&#xff0c;我们的收莸再总结&#xff0c;对我们的不足再反思&#xff0c;对我们的心态用调整。 形势比…

dot Net Frameworks中常见的设计模式

响应一下Anders Liu的号召(http://www.cnblogs.com/AndersLiu/archive/2007/05/29/763456.html)&#xff0c;列几个自己经常遇到的实现SINGLETON&#xff1a;System.DBNull.Value FACTORY METHOD&#xff1a;System.Data.IDbConnection.CreateCommand ()、System.Data.IDbComma…

如何构建一个向导操作模式程序

引导新用户熟悉产品的方式多种多样&#xff0c;向导程序是其中最经典也是最常用的一种。今天的文章&#xff0c;我们来聊聊向导程序的设计模式。 什么是向导程序 向导程序通常会提供一系列的步骤或者目标&#xff0c;让用户在完成步骤达成目标的过程中&#xff0c;逐步熟悉这个…

13 Tensorflow机制(翻译)

代码&#xff1a; tensorflow/examples/tutorials/mnist/ 本文的目的是来展示如何使用Tensorflow训练和评估手写数字识别问题。本文的观众是那些对使用Tensorflow进行机器学习感兴趣的人。 本文的目的并不是讲解机器学习。 请确认您已经安装了Tensorflow。 教程文件 文件作用mn…

鸟哥的 Linux 私房菜7 -- 首次开机关机与基本指令执行

鸟哥的 Linux 与 ADSL 私房菜 开机、关机、在线求助与指令下达方式最近更新日期&#xff1a;2004/05/01第一次登入系统与离开系统 图形模式与文字模式的切换方式 指令下达方式与基础指令练习 在线求助&#xff1a;man, info 正确的关机方式 开机过程的问题排解 本章习题练习 第…