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三元运算符实现方法
Dec 17 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
对python中的高效迭代器函数详解
Oct 18 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python中对数据进行各种排序的方法
Jul 02 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
python实现图像全景拼接
Mar 27 Python
Python新手如何理解循环加载模块
May 29 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
python开根号实例讲解
Aug 30 Python
python如何查找列表中元素的位置
May 30 Python
python数字图像处理之图像的批量处理
Jun 28 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
MVC模式的PHP实现
2006/10/09 PHP
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
Python 变量类型详解
2018/10/10 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
python编写猜数字小游戏
2019/10/06 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
酒后驾驶检讨书
2014/01/27 职场文书
优秀经理获奖感言
2014/03/04 职场文书
公司年会主持词
2014/03/22 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
公司更名通知函
2015/04/24 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers