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统计一个文本中重复行数的方法
Nov 19 Python
Python常用随机数与随机字符串方法实例
Apr 09 Python
浅析Python中将单词首字母大写的capitalize()方法
May 18 Python
python多进程共享变量
Apr 06 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
用matplotlib画等高线图详解
Dec 14 Python
Python实现ping指定IP的示例
Jun 04 Python
Sanic框架应用部署方法详解
Jul 18 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
基于PHP CURL用法的深入分析
2013/06/09 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
jQuery使用技巧简单汇总
2013/04/18 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
解决python replace函数替换无效问题
2020/01/18 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
高中化学教学反思
2014/01/13 职场文书
酒店员工辞职信范文
2015/02/28 职场文书
预备党员入党感言
2015/08/01 职场文书
Python读写yaml文件
2022/03/20 Python