《统计学习方法》 李航著 第九章 EM算法

我是小白一个;本文代码转载地址文末有注释;除代码和部分注释外大部分自己书写,有问题请多指教

模拟课本第一个例子,即用EM算法估计三个硬币模型的参数。

问题引入:有三个硬币:A、B、C。现在先投掷A,根据A的结果进行选择,A为正面选B,A为反面选C。然后用选出的硬币进行投掷。结果[1, 1, 0, 1, 0, 0, 1, 0, 1, 1]。问题:先只能观测到抛硬币结果,不能观测过程的前提下,如何估计三个硬币正面出现的概率,即三个硬币模型的参数。

EM算法解决代码:

import numpy as np

import math

class EM:

def __init__(self, prob):

self.pro_A, self.pro_B, self.pro_C = prob

# e_step

def pmf(self, i):

pro_1 = self.pro_A * math.pow(self.pro_B, data[i]) * math.pow(

(1 - self.pro_B), 1 - data[i])

pro_2 = (1 - self.pro_A) * math.pow(self.pro_C, data[i]) * math.pow(

(1 - self.pro_C), 1 - data[i])

return pro_1 / (pro_1 + pro_2)

# m_step

def fit(self, data):

count = len(data)

print('init prob:{}, {}, {}'.format(self.pro_A, self.pro_B,

self.pro_C))

for d in range(count):

# _ = yield # 关于yield强烈推荐这篇: https://developer.ibm.com/zh/articles/os-cn-python-yield/

_pmf = [self.pmf(k) for k in range(count)]

pro_A = 1 / count * sum(_pmf)

pro_B = sum([_pmf[k] * data[k] for k in range(count)]) / sum(

[_pmf[k] for k in range(count)])

pro_C = sum([(1 - _pmf[k]) * data[k]

for k in range(count)]) / sum([(1 - _pmf[k])

for k in range(count)])

print('{}/{} pro_a:{:.3f}, pro_b:{:.3f}, pro_c:{:.3f}'.format(

d + 1, count, pro_A, pro_B, pro_C))

self.pro_A = pro_A

self.pro_B = pro_B

self.pro_C = pro_C

data = [1, 1, 0, 1, 0, 0, 1, 0, 1, 1]

# 由于EM算法与初始值有关,这里有两组不同的初始值,以便体会

# 第一组

# em = EM(prob=[0.5, 0.5, 0.5])

# f = em.fit(data)

# 如果用yield

# 需要下边代码

# next(f) # 执行到上面的yield卡主,即只完成了初始化

# next(f) # 继续执行,到下一次yield之前。也就是完成了一次迭代

# 第二组

em = EM(prob=[0.4, 0.6, 0.7])

f2 = em.fit(data)

结果:

没有用yield时:

init prob:0.4, 0.6, 0.7

1/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

2/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

3/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

4/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

5/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

6/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

7/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

8/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

9/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

10/10 pro_a:0.406, pro_b:0.537, pro_c:0.643

用yield的时候一条一条输出上面的语句

em算法的java实现_机器学习——python模拟EM算法相关推荐

  1. 隐马尔可夫模型的java实现_机器学习——python模拟隐马尔可夫模型

    <统计学习方法> 李航著 第十章 隐马尔可夫模型 我是小白一个:本文代码转载地址文末有注释:有问题请多指教 先看书,看完书,代码就看懂了.程序只是将算法翻译成机器认识的罢了 import ...

  2. paxos算法java实现_基于python的Paxos算法实现

    理解一个算法最快,最深刻的做法,我觉着可能是自己手动实现,虽然项目中不用自己实现,有已经封装好的算法库,供我们调用,我觉着还是有必要自己亲自实践一下. 这里首先说明一下,python这种动态语言,对不 ...

  3. 维特比算法的java实现_原创:维特比算法

    看了宗成庆博士的<统计自然语言处理(中文信息处理)>的第六章,对维特比算法有着非常精辟的讲解.把其中的讲解上传上来,个人感觉比较正统. 今天用Java实现了这个算法,也可以转换为C代码: ...

  4. louvian算法 缺点 优化_机器学习中的优化算法(1)-优化算法重要性,SGD,Momentum(附Python示例)...

    本系列文章已转至 机器学习的优化器​zhuanlan.zhihu.com 优化算法在机器学习中扮演着至关重要的角色,了解常用的优化算法对于机器学习爱好者和从业者有着重要的意义. 这系列文章先讲述优化算 ...

  5. em算法怎么对应原有分类_机器学习系列之EM算法

    我讲EM算法的大概流程主要三部分:需要的预备知识.EM算法详解和对EM算法的改进. 一.EM算法的预备知识 1.极大似然估计 (1)举例说明:经典问题--学生身高问题 我们需要调查我们学校的男生和女生 ...

  6. 用python做算法需要哪些技能_成为一名CV算法工程师,你需要具备哪些能力?

    算法工程师应该是这两年国内外最热门的IT岗位了. 在2019年,阿里,字节跳动(抖音)等大厂的校招社招中,开出的offer及待遇可真的是一骑绝尘啊,校招就送股票,随随便便就年薪百万. 在国内,工作经验 ...

  7. 维特比算法的java实现_维特比算法通俗明白

    维特比算法说白了就是动态规划实现最短路径,只要知道"动态规划可以降低复杂度"这一点就能轻松理解维特比算法维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个 ...

  8. python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码

    利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...

  9. 算法工程师面试问答_机器学习算法_MachineLearningAlgorithm

    [关于 集成学习]那些你不知道的事 一.动机 不同的模型通常会在测试集上产生不同的误差:如果成员的误差是独立的,集成模型将显著地比其成员表现更好. 二.集成学习介绍篇 2.1 介绍篇 2.1.1 集成 ...

最新文章

  1. 通过“委派”过滤组策略设置
  2. Xshell6和Xftp下载地址,rzsz的使用
  3. 微软出面解释Win11各种大bug,引发网友一顿嘲讽:都是祖传手艺
  4. java搜索文件_Java如何在目录中搜索文件?
  5. java中hashcode作用_Java中hashCode的作用
  6. Eclipse不给提示no default proposals
  7. uniapp 可视化开发_uniapp的简单安装流程使用教程
  8. matlab将x排序 y随之变化,在MATLAB中:XData和YData如何用更改的行数更新?
  9. shiro利用mysql动态授权_SpringBoot+Shiro学习之数据库动态权限管理和Redis缓存
  10. STM32建好的工程为啥下载不进去程序
  11. Java基础-零拷贝技术应用案例
  12. 网易编程题——牛牛的闹钟
  13. 深度学习中降低过拟合(OverFitting)的方法
  14. c语言程序关键字查询,C语言关键字大全(共32个)
  15. 手机写代码 termux
  16. 语义分割数据集——VOC2012
  17. 磁珠的原理与应用注意事项
  18. Ubuntu系统下载及安装教程
  19. 干货 | 4步带你完成私有云盘搭建
  20. 基于jQuery发射弹幕的一个小案例

热门文章

  1. 计算机应用课程的专业建议,计算机应用技术专业课程衔接问题论文
  2. layui弹出层在登录中的应用
  3. Microsoft Sql Server Studio 2019 没有配置管理器解决办法
  4. 华军软件园——身边的流氓软件
  5. 内存卡修复工具有哪些?这2种强烈推荐!
  6. KeyBERT和labse提取字符串中的关键词
  7. 1399:甲流病人初筛(结构体运用)
  8. python的问题_Python小问题汇总(更新1)
  9. vmware workstation 15.5 pro 简易安装 win7 64位旗舰版 虚拟机
  10. java redis session共享_Springboot+redis实现session共享