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中的装饰器用法详解
Jan 14 Python
使用Python写CUDA程序的方法
Mar 27 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
浅谈python中真正关闭socket的方法
Dec 18 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
python实现AES加密和解密
Mar 27 Python
如何利用Python开发一个简单的猜数字游戏
Sep 22 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
Apr 30 Python
Django中F函数的使用示例代码详解
Jul 06 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
深入理解python协程
Jun 15 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
vue组件的写法汇总
2018/04/12 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
应届生求职信写作技巧
2013/10/24 职场文书
学校岗位设置方案
2014/01/16 职场文书
负责人任命书范本
2014/06/04 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
婚姻出轨保证书
2015/05/08 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers
MySQL深分页问题解决思路
2022/12/24 MySQL