转:http://blog.pluskid.org/?p=81

本文是“漫谈 Clustering 系列”中的第 5 篇,参见本系列的其他文章。

Expectation Maximization (EM) 是一种以迭代的方式来解决一类特殊最大似然 (Maximum Likelihood) 问题的方法,这类问题通常是无法直接求得最优解,但是如果引入隐含变量,在已知隐含变量的值的情况下,就可以转化为简单的情况,直接求得最大似然解。

我们会看到,上一次说到的 Gaussian Mixture Model 的迭代求解方法可以算是 EM 算法最典型的应用,而最开始说的 K-means 其实也可以看作是 Gaussian Mixture Model 的一个变种(固定所有的  ,并令  即可)。然而 EM 实际上是一种通用的算法(或者说是框架),可以用来解决很多类似的问题,我们最后将以一个中文分词的例子来说明这一点。

为了避免问题变得太抽象,我们还是先从上一次的 Gaussian Mixture Model 说起吧。回顾一下我们之前要解决的问题:求以下 Log-likelihood function 的最大值:

而  的概率,当  的第  个元素为 1 的时候,亦即第  个 Component 被选中的时候,这个概率为  ,统一地写出来就是:

情况瞬间逆转,现在  和求和符号换了个位置,直接作用在普通的高斯分布上了,一下子就变成了可以直接求解的问题。不过,事情之所以能发展得如此顺利,完全依赖于一个我们伪造的假设:隐含变量的值已知。然而实际上我们并不知道这个值。问题的结症在这里了,如果我们有了这个值,所有的问题都迎刃而解了。回想一下,在类似的地方,我们是如何处理这样的情况的呢?一个很类似的地方就是(比如,在数据挖掘中)处理缺失数据的情况,一般有几种办法:

  • 用取值范围类的随机值代替。
  • 用平均值代替。
  • 填 0 或者其他特殊值。

这里我们采取一种类似于平均值的办法:取期望。因为这里我们至少有 sample  的值,因此我们可以把这个信息利用起来,针对后验概率  来取期望。前面说过, 的每一个元素只有 0 和 1 两种取值,因此按照期望的公式写出来就是:

其中  是分布  和  之间的 Kullback-Leibler divergence 。由于 Kullback-Leibler divergence 是非负的,并且只有当两个分布完全相同的时候才会取到 0 。因此我们可以得到关系  ,亦即  是  的一个下界。

现在考虑 EM 的迭代过程,记上一次迭代得出的参数为 ,现在我们要选取  以令  最大,由于  并不依赖于  ,因此  的上限(在  固定的时候)是一个定值,它取到这个最大值的条件就是 Kullback-Leibler divergence 为零,亦即  等于后验概率  。把它带入到  的表达式中可以得到

其中  的值是从模型  中已知的。但是现在我们不知道  的值,因此我们转而取其关于后验概率的期望:

<img src="http://blog.pluskid.org/latexrender/pictures/27b7f3733fbb8899ae20527bf4706422.png" _xhe_src="http://blog.pluskid.org/latexrender/pictures/27b7f3733fbb8899ae20527bf4706422.png" title="" \displaystyle"="" alt="" align="absmiddle" style="border: 0px; margin-left: auto; margin-right: auto;">

然后将这个期望针对  最大化即完成了 EM 的一次迭代。具体的做法通常是先把一个初始文本(比如所有的  的集合)按照 N-gram 分割(N-gram 在 讲 K-medoids 的那篇文章中介绍过)为 ,形成一个最初的辞典,而模型  的参数  实际上就描述了各个 N-gram 的概率  ,初始值可以直接取为频率值。有了辞典之后对于任意的  ,我们可以根据辞典枚举出所有可能的分割  ,而每个分割的后验概率  就是其中的单词的概率乘积。其他的就是标准的 EM 算法的迭代步骤了。

实际上在实际产品中我们会使用一些带了更多启发式规则的分词方法(比如 MMSEG),而这个方法更大的用处在于从一堆文本中“学习”出一个词典来(也就是  ),并且这个过程是全自动的,主要有两个优点:

  1. 不需要人参与手工分词、标记等。
  2. 能自动从文本中学习,换句话说,你给它一些某个领域的专业文章,它能从中学习到这个领域的专业词汇来。

不管怎样,以上两点看起来都非常诱人。不过理论离实际往往还是有不少差距的。我不知道实际分词系统中有没有在用这样的方法来做训练的。之前我曾经用 Wikipedia (繁体中文)上抓下来的一些数据跑过一下小规模的试验,结果还可以,但是也并不如想像中的完美。因为当时也并没有弄明白 EM 是怎么一回事,加上这个过程本身计算负荷还是非常大的,也就没有深入下去。也许以后有时间可以再尝试一下。

总之,EM 是一种应用广泛的算法,虽然讲了点理论也讲了例子,但是一没有贴代码二没有贴图片,似乎实在是不像我的作风,不过精力和篇幅有限,也只能到此为止了。 

漫谈 Clustering (番外篇): Expectation Maximization相关推荐

  1. [zt]数学之美番外篇:平凡而又神奇的贝叶斯方法

    数学之美番外篇:平凡而又神奇的贝叶斯方法 Tags: 数学, 机器学习与人工智能, 计算机科学 save it69 saved tags: 贝叶斯 math bayesian algorithm 数学 ...

  2. 转:数学之美番外篇:平凡而又神奇的贝叶斯方法 收藏

    为什么80%的码农都做不了架构师?>>>    转自:http://blog.csdn.net/pongba/archive/2008/09/21/2958094.aspx 数学之美 ...

  3. 『中级篇』docker之wordpress容器SSL(番外篇)(78)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之wordpress容器SSL(番外篇)(78) 搞了2天终于搞定了,现在分享给大家. apache2 ...

  4. 『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』docker之虚拟机创建vagrant技巧(番外篇)(81) 之前一直用的原生的centos7的源镜像安装虚拟机,然 ...

  5. yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)

    1264: yxy和志愿者小姐姐番外篇之大宝宝123追番记 时间限制: 1 Sec  内存限制: 64 MB                                               ...

  6. 教你从0到1搭建秒杀系统-Canal快速入门(番外篇)

    Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能会用到.本篇介绍一下数据库中间件Canal的使用. 很多时候为了缩短调用延时,我们会对部分接口数据加入了缓存.一旦这些数据 ...

  7. 文本分类入门(番外篇)特征选择与特征权重计算的区别

    文本分类入门(番外篇)特征选择与特征权重计算的区别 在文本分类的过程中,特征(也可以简单的理解为"词")从人类能够理解的形式转换为计算机能够理解的形式时,实际上经过了两步骤的量化- ...

  8. 5年前面试题引发的“血案”(番外篇)(总结和乱侃)

    这货是说好的番外篇-- 所谓的番外篇其实就是对前面的各个知识点做一些总结. 血案(1)中的两个内容主要是日志切换时的检查点和表空间管理. 日志切换其实远远没有简单,有关于检查点和日志文件的内容太多了, ...

  9. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  10. PostCSS自学笔记(二)【番外篇二】

    图解PostCSS的插件执行顺序 文章其实是一系列的早就写完了. 才发现忘了发在SegmentFault上面, 最早发布于https://gitee.com/janking/Inf... 这次我继续研 ...

最新文章

  1. 起底滴滴数据科学团队:面对超复杂线下场景,要数据驱动,但拒绝“唯数据论”...
  2. 第十、十一周项目一-点-圆-圆柱类族的设计(1)
  3. linux 内核编译错误 undefined reference to '__mutex_lock_slowpath'
  4. linux共享比windows好处,开源Linux虚拟化优势比Windows有何特点?
  5. php动态加载js,动态加载script文件的两种方法_javascript技巧
  6. CentOS6.5通过jdk8.rpm文件安装JDK8
  7. 抠图为什么要用绿布_《暮白首》为什么如此火爆?五个原因带你深度剖析
  8. 飞畅科技-工业以太网的应用现状及前景展望
  9. 一步步编写操作系统 1 部署工作环境 1
  10. 解惑Python模块学习,该如何着手操作...
  11. python常量列表_Python中实现常量(Const)功能
  12. php mysql delete_php教程之PHP MySQL Delete
  13. jQuery实现简单的百分比进度条
  14. ubuntu系统安装初始化脚本
  15. python 将图像变为矢量图(可字符和序列化)
  16. CentOS7下fdisk分区工具和LVM的简单使用
  17. XlsxWriter的使用
  18. 软媒定时关机,电脑无法启动
  19. 计算机网络 | 应用层
  20. 简历上的项目经历怎么写 ?这 3 条原则不可忽视 !...

热门文章

  1. VMware esxi在线增加Linux LVM硬盘不需重新启动
  2. 人生是什么?——感悟1:勇于承担自己的选择才是真正的勇气
  3. 【相机标定系列】标定工具仓库
  4. 面向过程和面向对象的区别,通俗易懂
  5. pandas.Series
  6. 把grid第一列设置为行号
  7. java B2B2C 源码 多级分销Springcloud多租户电子商城系统-SpringCloud配置中心内容加密...
  8. [编程] C语言变量和数据类型总结练习题
  9. python下的MySQLdb使用
  10. Tomcat and solr 环境配置