EM算法是一种迭代算法,全称为期望极大算法(expectation maximization algorithm),用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计。

一、EM算法的原理

EM算法
输入:观测变量数据Y,隐变量数据Z,联合分布P(Y,Z|θ),条件分布P(Z|Y,θ);
输出:模型参数θ
(1)选择参数的初值θ0,开始迭代;
(2)E步:记θi为第i次迭代参数θ的估计值,在第i+1次迭代的E步,计算

这里,P(Z|Y,θi)是在给定观测数据Y和当前的参数估计θi下隐变量数据Z的条件概率分布;
(3)M步:求使Q(θ,θi)极大化的θ,确定第i+1次迭代的参数的估计值θi+1

(4)重复第(2)步和第(3)步,直到收敛。
其中,函数Q(θ,θi)是EM算法的核心,称为Q函数(Q function),是完全数据的对数似然函数logP(Y,Z|θ)关于在给定观测数据Y和当前参数θi下对未知观测数据Z的条件概率分布P(Z|Y,θi)的期望,即

EM算法与初值的选择有关,选择不同的初值可能得到不同的参数估计值。

二、EM算法在NLP自动文本分类中的应用

假设有N篇文本,对应N个向量,希望把它们分到K类中,而这K类的中心是。则利用EM算法进行分类的步骤如下:
(1)随机挑选K个点,作为起始的中心,如下图中各个点属于三个类,用黑十字代表随机指定的类的中心;

(2)计算所有点到这些聚类中心的距离,将这些点归到最近的一类中;

(3)重新计算每一类的中心。假定某一类中的v,每一个点有多个维度,即

最简单的办法就是用这些类的中心作为其中心,其中第i维的值为:

新的聚类中心和原先的相比会有一个位移,图27.2中用箭头表示了中心的移动,箭头指向处为新的聚类中心。
(4)重复上述过程,直到每次新的中心和旧的中心之间偏移非常非常小,即过程收敛。

以上便是EM算法在NLP自动文本分类中的应用。

三、EM算法的简单实例及其python实现

EM算法简单实例
(三硬币模型)假设有3枚硬币,分别记作A,B,C。这些硬币正面出现的概率分别是pro_A, pro_B,por_C。进行如下掷硬币试验:先掷硬币A,根据其结果选出硬币B或硬币C,正面选硬币B,反面选硬币C;然后掷选出的硬币,掷硬币的结果,出现正面记作1,出现反面记作0;独立重复n次试验(这里n=10),观测结果如下:
1,1,0,1,0,0,1,0,1,1
假设只能观测到掷硬币的结果,不能观测掷硬币的过程。问如何估计三硬币正面出现的概率,即三硬币模型的参数。

EM算法简单实例的python实现

import numpy as np
import math
#设A,B,C的初始值均为0.5
pro_A, pro_B, por_C = 0.5, 0.5, 0.5def pmf(i, pro_A, pro_B, por_C):pro_1 = pro_A * math.pow(pro_B, data[i]) * math.pow((1-pro_B), 1-data[i])pro_2 = pro_A * math.pow(pro_C, data[i]) * math.pow((1-pro_C), 1-data[i])return pro_1 / (pro_1 + pro_2)class EM:def __init__(self, prob):self.pro_A, self.pro_B, self.pro_C = prob# e步def pmf(self, i):pro_1 = self.pro_A * math.pow(self.pro_B, data[i]) * math.pow((1-self.pro_B), 1-data[i])pro_2 = (1 - self.pro_A) * math.pow(self.pro_C, data[i]) * math.pow((1-self.pro_C), 1-data[i])return pro_1 / (pro_1 + pro_2)# m步def fit(self, data):count = len(data)print('init prob:{}, {}, {}'.format(self.pro_A, self.pro_B, self.pro_C))for d in range(count):_ = yield_pmf = [self.pmf(k) for k in range(count)]pro_A = 1/ count * sum(_pmf)pro_B = sum([_pmf[k]*data[k] for k in range(count)]) / sum([_pmf[k] for k in range(count)])pro_C = sum([(1-_pmf[k])*data[k] for k in range(count)]) / sum([(1-_pmf[k]) for k in range(count)])print('{}/{}  pro_a:{:.3f}, pro_b:{:.3f}, pro_c:{:.3f}'.format(d+1, count, pro_A, pro_B, pro_C))self.pro_A = pro_Aself.pro_B = pro_Bself.pro_C = pro_C#输入数据1,1,0,1,0,0,1,0,1,1
data=[1,1,0,1,0,0,1,0,1,1]print('----------初始值情况1----------')
em = EM(prob=[0.5, 0.5, 0.5])
f = em.fit(data)
next(f)
# 第一次迭代
print('----------第一次迭代结果----------')
f.send(1)
# 第二次迭代
print('----------第二次迭代结果----------')
f.send(2)print('----------初始值情况2---------')
#将A,B,C的初始值改为0.4, 0.6, 0.7
em = EM(prob=[0.4, 0.6, 0.7])
f2 = em.fit(data)
next(f2)
# 第一次迭代
print('----------第一次迭代结果----------')
f2.send(1)
# 第二次迭代
print('----------第二次迭代结果----------')
f2.send(2)

运行结果:

----------初始值情况1----------
init prob:0.5, 0.5, 0.5
----------第一次迭代结果----------
1/10  pro_a:0.500, pro_b:0.600, pro_c:0.600
----------第二次迭代结果----------
2/10  pro_a:0.500, pro_b:0.600, pro_c:0.600
----------初始值情况2----------
init prob:0.4, 0.6, 0.7
----------第一次迭代结果----------
1/10  pro_a:0.406, pro_b:0.537, pro_c:0.643
----------第二次迭代结果----------
2/10  pro_a:0.406, pro_b:0.537, pro_c:0.643

参考资料:
《统计学习方法》------李航
《数学之美》------吴军

EM算法原理及其在NLP中的应用相关推荐

  1. 高斯-赛得尔迭代式 c++_高斯混合模型(Gaussian Mixture Model)与EM算法原理(一)

    高斯混合模型(Gaussian Mixture Model)是机器学习中一种常用的聚类算法,本文介绍了其原理,并推导了其参数估计的过程.主要参考Christopher M. Bishop的<Pa ...

  2. 机器学习 | EM 算法原理

    文章目录 EM 算法 1. EM 算法的引入 三硬币模型 2. EM 算法 Q 函数 参考文献 相关文章: 机器学习 | 目录 无监督学习 | GMM 高斯混合原理及Sklearn实现 本文大部分内容 ...

  3. EM算法原理简析——图解

    一. 扯淡 转眼间毕业快一年了,这期间混了两份工作,从游戏开发到算法.感觉自己还是喜欢算法,可能是大学混了几年算法吧!所以不想浪费基础... 我是个懒得写博客的人,混了几年coding,写的博客不超过 ...

  4. (转载)机器学习知识点(十四)EM算法原理

    1.引言 以前我们讨论的概率模型都是只含观测变量(observable variable), 即这些变量都是可以观测出来的,那么给定数据,可以直接使用极大似然估计的方法或者贝叶斯估计的方法:但是当模型 ...

  5. watershed 算法原理以及skimage/opencv中的使用

    watershed 参考 分水岭算法 代码 opencv scikit-image 参考 scikit_image中的watershed说明 OpenCV-图像分割中的分水岭算法原理与应用 图像分割的 ...

  6. 《统计学习方法》 第九章 EM算法(原理+代码)

    EM算法 EM算法是含有隐变量的概率模型极大似然估计或极大后验概率估计的迭代算法 含有隐变量的概率模型的数据表示为 θ \theta θ 这里, Y Y Y是观测变量的数据, Z Z Z是隐变量的数据 ...

  7. EM算法在高斯混合模型学习中的应用

    本篇文章是之前期望极大算法(EM算法)文章的后续,有需要可以先看看那篇文章关于EM算法的推导. 高斯混合模型 高斯混合模型是研究算法的人避不开的一个东西,其在非深度学习的远古时代经常被用到,比如图像处 ...

  8. HyperLogLog 算法原理及其在 Redis 中的实现

    一.问题引入 大家在项目上可能会遇到过下面这些相同或者类似的需求: 统计一个APP的日活量(DAU)和月活量(MAU).日活(月活)是指在一个统计日(统计月)之内,登录或者使用产品的不同用户数量,它是 ...

  9. 一致性哈希算法原理及其在分布式系统中的应用

    本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如 ...

最新文章

  1. VNC下安装Oracle报错--Could not execute auto check for display colors
  2. 关于线程池ExecutorService的shutdown()与shutdownNow()方法的区别
  3. Visual stuidio 快捷键的修改、查询
  4. sip gw功能包括_道哥漫谈:大话有趣的SIP通信
  5. XML —— DTD介绍
  6. heroku_将应用程序集成为Heroku附加组件
  7. ubuntu 打包压缩
  8. 定义斜体文本的html标签,HTML 文本格式化
  9. (通用版)salesforce中soql及sosl的伪‘Like’模糊检索
  10. 通俗理解九大排序算法
  11. 自定义Cell引发的悲剧。。。。
  12. Windows程序设计之WinAPI详解程序
  13. SD内存卡禁止写入只读怎么办?另类SPI模式修复坏卡
  14. java excel 插件开发工具_强力推荐!五款能让你成为Excel“高手”的Excel插件
  15. win10开始键没反应解决方法
  16. CSP小白起步-20131201
  17. joycdr2html.exe系统错误,win7安装软件CDR2020 弹出错误1719无法访问Windws Installer服务解决方案...
  18. 【HUE】问题汇总(持续更新)
  19. java中jdk的下载与安装
  20. python 显示表格数据_python显示excel表格数据-怎么用python读取excel表格的数据

热门文章

  1. 一文聊透数字化转型,获得企业未来生存的入场券--童亚斋
  2. 大乌龙:系统出错,被接受的加拿大移民申请超出限额7307份
  3. 前端快速入门 TCP/IP
  4. unity3d做会减少的血条_用Unity做血条或进度条常用脚本 - 纳金网
  5. flexpaper流读取
  6. eclipse的PHP插件安装
  7. boos:一些实用工具
  8. CSS父级选择器 :has()
  9. WPF ToolBar
  10. linux 传送大文件,使用Transfer.sh在Linux上的终端中传输大文件 | MOS86