09_EM算法
今天是2020年3月5日星期四。预计开学时间不会早于四月初,真是好消息,可以有大把的时间整理知识点(实际上发文章的时间都6月6号了,希望9月份能开学啊,不耽误找工作~)。每次导师找,整个人会变的特别烦躁,烦躁加不安,其它事情一点都做不下去,焦虑。改小论文这几天耽误了一些时间,查了些EM算法的例子,怎样理解这个算法呢?通过这周的学习,觉得数学公式有点唬人,但却是理解该算法最好的形式。
刚开始对这个算法一无所知,通过知乎、CSDN看资料,看白板视频,看讲解例子。越看例子越觉得负担重,因为要先把例子理解了,再去理解这个知识点。例子不能彻底理解,知识点也走不下去,倒不如一遍一遍的看数学公式。看完了公式,再去看例子,朦朦胧胧的就懂了。之后再去看白板视频,绝对是不一样的体验。
先看别人的视频,然后自己去推导公式,你会觉得困难摸不到头脑;先自己去推导公式,再去看别人视频,你会觉得心旷神怡一目了然。第一种做法,往往看视频的时候就是懵懵哒,抓不住别人讲述的重点;第二种做法,类似于先学会了九阳神功,再去和别人切磋武艺。初心是将《统计学习方法》这本书做详细的心得笔记,现在有点松动,希望能坚持下去。
GitHub:https://github.com/wangzycloud/statistical-learning-method
EM算法
引入
EM算法应该作为一种通用的求解方法,用于含有隐变量的概率模型参数的极大似然估计。拆开来看,这句话是应用在概率模型上的;用来估计概率模型的参数;类似于极大似然估计;求解的是含有隐变量的概率模型。那么问题来了,什么是该有隐变量的概率模型?概率模型是什么样子?极大似然估计?该方法是怎么进行计算的呢?
通常来讲,EM算法是一种迭代算法,每次迭代由两步组成:E步,求期望;M步:求极大,所以该算法被称为期望极大算法。说该算法可以作为一种通用的求解方法,原因在于:该算法不是NBM、LR、SVM这类解决相应场景的模型,而是可以用于求解含有隐变量概率模型的参数估计。
提到模型,脑子里第一印象有判别模型、生成模型。这里的概率模型自然和判别模型、生成模型不在同一个层次。在我的理解里,概率模型是类似于朴素贝叶斯算法这种,用概率来表示最后的分类标准;而不是感知机、SVM这种利用确信度来表达分类结果的模型。再考虑一下朴素贝叶斯算法,特征向量里的随机变量X,以及表示类别的随机变量Y,都是可以被观测到变量。在所有随机变量都可以观测到的情况下,我们可以利用极大似然估计来求解模型的参数。对于含有隐变量的概率模型,要如何求解呢?含有隐变量意味着不能观测到数据的全部状况,也就没有办法直接利用极大似然估计来求解。
现在看到的EM算法,就是一种求解含有隐变量的概率模型参数的极大似然估计方法。
EM算法
书本上三硬币模型,挺好的~代码已整理到github中,实际上就是把书本公式用代码实现出来...难度不大。


文中提到,该问题没有解析解,只有通过迭代的方法进行求解。仔细观察一下公式(9.4),log(x)作用在公式(9.3)上,很明显log连乘可以变成连加,但连加式子中的每个项仍然是连加式
。好像是因为这个原因,就无法得到解析解了。个人对数学不感冒,只能硬性的记住“不容易求解析解”这点,至于原因,实在是搞不懂啊。虽然无法得到解析解,但我们可以通过EM算法求解,大致步骤如下:



一般的,用Y表示观测随机变量的数据,Z表示隐随机变量的数据,Y和Z连在一起称为完全数据,观测数据Y又称为不完全数据。假设给定观测数据Y,其概率分布是P(Y|θ),其中θ是需要估计的模型参数,那么不完全数据Y的似然函数是P(Y|θ),对数似然函数L(θ)=logP(Y|θ),假设Y和Z的联合概率分布是P(Y,Z|θ),那么完全数据的对数似然函数是logP(Y,Z|θ)。
EM算法通过迭代求解L(θ)=logP(Y|θ)的极大似然估计,每次迭代由两个步骤:E步,M步组成。

文中对Q函数做了具体解释:

关于EM算法的几点说明,应该挺好理解的吧。步骤(1),迭代求解的方式需要一步步接近极值,是在某个解的基础上,进一步求解。在最开始的时候,初值是任意选择的,并且正是因为初值任意选择,容易陷入局部极值,也就是对初值的选择非常敏感(对比一下梯度下降的过程)。步骤(2),我们要清楚,求解的对象是变元参数θ。步骤(3),极大化的过程,详见下图~(θ,L(θ))图像。步骤(4),迭代停止条件。
EM算法的导出、收敛性,以及推广详见下图吧~搞了四五天,弄了个流程...

GMM高斯混合模型
书中公式一大堆,不太友好,手写代码的过程,就是把书本公式复现了一遍。难度不大,我认为需要先了解GMM模型是啥,再通过例子,熟悉一下计算过程,就可以掌握了。
还是从生成数据的角度看,由GMM模型生成一个数据,是要根据一个普通的多项式分布αk,来选择第k个高斯分布,分两步生成数据。但是,这里获得的数据,并不知道来自第几个αk,这就是隐变量了。

对于高斯混合模型的参数估计,可以通过EM算法求解。
1.明确隐变量,写出完全数据的对数似然函数。
2.EM算法的E步:确定Q函数。
3.确定EM算法的M步。
具体公式(9.26)-公式(9.32)就不一一摘录了,github已复现。算法描述如下:


本节整理的内容有些水...
09_EM算法的更多相关文章
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- 虚拟dom与diff算法 分析
好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- 神经网络、logistic回归等分类算法简单实现
最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
随机推荐
- 2020网鼎杯 白虎组reverse:hero
主函数,当bossexist的值不为0时,while循环dround()函数,循环结束输出flag outflag()函数的flag值由6段数据拼凑而成 while循环的dround()函数有三个选择 ...
- 基于Memcached的Nginx服务器集群session共享
原料:jdk1.8,tomcat7,nginx1.16,memcached-1.2.6,Mem-Tomcat需要的jar包,基于windows7.所有的点击以下链接可下载 链接:https://pan ...
- 聊聊Grpc使用中的坑以及怎么填
总所周知,随着云技术的发展,和业务的复杂度的上升,越来越多的系统开始拆分成独立的子模块微服务.模块之间免不了相互通信.但是随着业务量的增多,传输量也随之增大,偶发性timeout,无响应, 传输量过大 ...
- 符合PSR-0规范的自动加载
PSR-0规范 命名空间必须与绝对路径一致 类名首字母必须大写 除去入口文件外,其他“.php”必须只有一个类 类文件必须自动载入,不采用include等 单一入口 1)目录结构 2)代码 入口文件i ...
- SimpleAuthenticationInfo的参数
SimpleAuthenticationInfo的参数 仅供个人参考,以及学习记录.SimpleAuthenticationInfo authenticationInfo = new SimpleAu ...
- shiro的ssm集成和简单的开发尝试
配置web.xml <!-- 配置shiro的集成开始 --> <filter> <filter-name>shiroFilter</filter-name& ...
- PLC可编程控制器的结构和工作原理
PLC的可编程控制器由的功能结构由cpu中央处理器,存储器和输入输出借口三部分组成 CPU Cpu的功能是完成plc所有的的控制和监视, Cpu中央处理去由控制器,寄存器,运算器.通过数据总线,地址总 ...
- 关于pytest使用allure生成报告时,报一堆警告和缺少XX模块
因为最新的pytest 支持*.josn的用例报告,卸载旧的模块使用新的即可: 需要移除旧模块:pip uninstall pytest-allure-adaptor, 并安装:pip install ...
- spark学习笔记总结
Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用.减少了延时处理,提高 ...
- 前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包
在前端开发中,有一个非常重要的技能,叫做断点调试. 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象, ...