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已上传可供下载 ...
随机推荐
- 黑马程序员_毕向东_Java基础视频教程——进制转换之负数二进制(随笔)
进制转换之负数二进制 负数的二进制表现形式 6 = 110 -6 : 其实就是 6 的二进制取反再 + 1 一个整数在内存中是占 4 个字节 **取反:将二进制里的 1 变成 0,0 变成 1. 以6 ...
- sqlservere小计合计总计
SELECT CASE WHEN GROUPING(F1) = 1 THEN '总计' WHEN GROUPING(F1) = 0 AND GROUPING(F2) = 1 THEN F1+'合计' ...
- async/await的语法和使用
1. async 函数 (1)函数的返回值为promise对象 (2)promise对象的结果由async函数执行的返回值决定 2. await 表达式 (1)await右侧的 ...
- 14.1 Go数据结构
14.1 Go数据结构 每一个程序都在学习十八般武艺,学习语言.数据库.HTTP等技能. 而程序中的九阳神功就是数据结构与算,掌握了数据结构与算法,你的内功修炼就会有质的飞跃. 无论从事业务开发,测评 ...
- base64编码的字符串(含有中文) 前端解码
base64编码的字符串(含有中文) 前端解码 https://xue5602.github.io/2018/12/19/atob%E8%A7%A3%E7%A0%81utf-8%E5%AD%97%E7 ...
- GeoServer2.17与Jetty9在Windows上的最佳安装实践
1 JDK的选择 我使用了adopted openjdk8.0.252,安装简便,只需添加2个环境变量(JAVA_HOME,JRE_HOME)即可. 我的安装路径: C:\SDKs\adoptopen ...
- Ajax用法查询
1)$.get(url, [data], [callback], [type]) 2)$.post(url, [data], [callback], [type]) 其中: url:代表请求的服务器端 ...
- python爬取页面内容
from selenium import webdriverimport xlwt driver = webdriver.Chrome(r'D:\chromedriver.exe')driver.ma ...
- Spark SQL源码解析(五)SparkPlan准备和执行阶段
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Spark SQL源码解析(三 ...
- 读Pyqt4教程,带你入门Pyqt4 _009
QLineEdit QLineEdit 窗口组件用来输入或者编辑单行纯文本,有撤销/重做,剪切/粘贴和拖放功能. #!/usr/bin/python # -*- coding: utf-8 -*- # ...