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中urllib模块用法实例详解
Nov 19 Python
python递归查询菜单并转换成json实例
Mar 27 Python
关于Python 3中print函数的换行详解
Aug 08 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
详解django+django-celery+celery的整合实战
Mar 19 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
pymysql模块使用简介与示例
Nov 17 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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
Zend的MVC机制使用分析(一)
2013/05/02 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
python实现的jpg格式图片修复代码
2015/04/21 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
交通专业个人自荐信格式
2013/09/23 职场文书
国际会议邀请函范文
2014/01/16 职场文书
成语的广告词
2014/03/19 职场文书
2014年党支部学习材料
2014/05/19 职场文书
长城的导游词
2015/01/30 职场文书
聘任合同书
2015/09/21 职场文书
企业团队精神心得体会
2016/01/19 职场文书
入党申请书怎么写?
2019/06/11 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书