Python实现EM算法实例代码


Posted in Python onOctober 04, 2020

EM算法实例

通过实例可以快速了解EM算法的基本思想,具体推导请点文末链接。图a是让我们预热的,图b是EM算法的实例。

这是一个抛硬币的例子,H表示正面向上,T表示反面向上,参数θ表示正面朝上的概率。硬币有两个,A和B,硬币是有偏的。本次实验总共做了5组,每组随机选一个硬币,连续抛10次。如果知道每次抛的是哪个硬币,那么计算参数θ就非常简单了,如

下图所示:

Python实现EM算法实例代码

如果不知道每次抛的是哪个硬币呢?那么,我们就需要用EM算法,基本步骤为:

  1、给θ_AθA​和θ_BθB​一个初始值;

  2、(E-step)估计每组实验是硬币A的概率(本组实验是硬币B的概率=1-本组实验是硬币A的概率)。分别计算每组实验中,选择A硬币且正面朝上次数的期望值,选择B硬币且正面朝上次数的期望值;

  3、(M-step)利用第三步求得的期望值重新计算θ_AθA​和θ_BθB​;

  4、当迭代到一定次数,或者算法收敛到一定精度,结束算法,否则,回到第2步。

Python实现EM算法实例代码

计算过程详解:初始值θ_A^{(0)}θA(0)​=0.6,θ_B^{(0)}θB(0)​=0.5。

由两个硬币的初始值0.6和0.5,容易得出投掷出5正5反的概率是p_A=C^5_{10}*(0.6^5)*(0.4^5)pA​=C105​∗(0.65)∗(0.45),p_B=C_{10}^5*(0.5^5)*(0.5^5)pB​=C105​∗(0.55)∗(0.55), p_ApA​/(p_ApA​+p_BpB​)=0.449, 0.45就是0.449近似而来的,表示第一组实验选择的硬币是A的概率为0.45。然后,0.449 * 5H = 2.2H ,0.449 * 5T = 2.2T ,表示第一组实验选择A硬币且正面朝上次数和反面朝上次数的期望值都是2.2,其他的值依次类推。最后,求出θ_A^{(1)}θA(1)​=0.71,θ_B^{(1)}θB(1)​=0.58。重复上述过程,不断迭代,直到算法收敛到一定精度为止。

这篇博客对EM算法的推导非常详细,链接如下:

https://blog.csdn.net/zhihua_oba/article/details/73776553

Python实现

#coding=utf-8
from numpy import *
from scipy import stats
import time
start = time.perf_counter()

def em_single(priors,observations):
 """
 EM算法的单次迭代
 Arguments
 ------------
 priors:[theta_A,theta_B]
 observation:[m X n matrix]

 Returns
 ---------------
 new_priors:[new_theta_A,new_theta_B]
 :param priors:
 :param observations:
 :return:
 """
 counts = {'A': {'H': 0, 'T': 0}, 'B': {'H': 0, 'T': 0}}
 theta_A = priors[0]
 theta_B = priors[1]
 #E step
 for observation in observations:
  len_observation = len(observation)
  num_heads = observation.sum()
  num_tails = len_observation-num_heads
  #二项分布求解公式
  contribution_A = stats.binom.pmf(num_heads,len_observation,theta_A)
  contribution_B = stats.binom.pmf(num_heads,len_observation,theta_B)

  weight_A = contribution_A / (contribution_A + contribution_B)
  weight_B = contribution_B / (contribution_A + contribution_B)
  #更新在当前参数下A,B硬币产生的正反面次数
  counts['A']['H'] += weight_A * num_heads
  counts['A']['T'] += weight_A * num_tails
  counts['B']['H'] += weight_B * num_heads
  counts['B']['T'] += weight_B * num_tails

 # M step
 new_theta_A = counts['A']['H'] / (counts['A']['H'] + counts['A']['T'])
 new_theta_B = counts['B']['H'] / (counts['B']['H'] + counts['B']['T'])
 return [new_theta_A,new_theta_B]


def em(observations,prior,tol = 1e-6,iterations=10000):
 """
 EM算法
 :param observations :观测数据
 :param prior:模型初值
 :param tol:迭代结束阈值
 :param iterations:最大迭代次数
 :return:局部最优的模型参数
 """
 iteration = 0;
 while iteration < iterations:
  new_prior = em_single(prior,observations)
  delta_change = abs(prior[0]-new_prior[0])
  if delta_change < tol:
   break
  else:
   prior = new_prior
   iteration +=1
 return [new_prior,iteration]

#硬币投掷结果
observations = array([[1,0,0,0,1,1,0,1,0,1],
      [1,1,1,1,0,1,1,1,0,1],
      [1,0,1,1,1,1,1,0,1,1],
      [1,0,1,0,0,0,1,1,0,0],
      [0,1,1,1,0,1,1,1,0,1]])
print (em(observations,[0.6,0.5]))
end = time.perf_counter()
print('Running time: %f seconds'%(end-start))

总结

到此这篇关于Python实现EM算法实例的文章就介绍到这了,更多相关Python实现EM算法实例内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python dict remove数组删除(del,pop)
Mar 24 Python
wxPython框架类和面板类的使用实例
Sep 28 Python
python实现调用其他python脚本的方法
Oct 05 Python
Python正则表达式教程之三:贪婪/非贪婪特性
Mar 02 Python
python类的继承实例详解
Mar 30 Python
Python实现删除文件中含“指定内容”的行示例
Jun 09 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
Python设计模式之原型模式实例详解
Jan 18 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
python 将视频 通过视频帧转换成时间实例
Apr 23 Python
keras中的backend.clip用法
May 22 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 Python
python em算法的实现
Oct 03 #Python
浅析Python中字符串的intern机制
Oct 03 #Python
Python实现AES加密,解密的两种方法
Oct 03 #Python
python实现AdaBoost算法的示例
Oct 03 #Python
Django创建一个后台的基本步骤记录
Oct 02 #Python
Python中qutip用法示例详解
Oct 02 #Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 #Python
You might like
web方式ftp
2006/10/09 PHP
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
php微信开发接入
2016/08/27 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
js简单抽奖代码
2015/01/16 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
Django forms组件的使用教程
2018/10/08 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
护士的岗位职责
2013/12/04 职场文书
大学生最常用的自我评价
2013/12/07 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
党日活动总结
2014/05/07 职场文书
销售团队口号大全
2014/06/06 职场文书
小学英语听课心得体会
2016/01/14 职场文书
2019入党申请书格式
2019/06/25 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python