EM算法——投硬币样例实现

news2024/12/29 9:42:38

理论参考

【机器学习】EM——期望最大(非常详细)

样例介绍

有c个硬币,每次随机选一个投掷n次,重复执行m次并记录结果。
根据投掷结果计算出每个硬币正面的概率。
每次选择的硬币未知。

过程介绍

  1. 随机初始化硬币为正的概率 head_p
  2. 根据 head_p 求出选择某个硬币的概率 selected_p
  3. 根据 selected_p 计算新的硬币概率 head_p
  4. 若 head_p 收敛,执行5;否则,执行2
  5. 结束

代码实现

导入库

import random
import numpy as np
from tqdm import tqdm
from collections import Counter
import matplotlib.pyplot as plt

设置硬币朝上的真实值

coin_num:硬币数

coins:硬币正面朝上的真实值

# 设置真实值
coin_num = 5
coins = []
for _ in range(coin_num):
    coins.append(random.randint(0, 100)/100)
coins

模拟投币

  1. 随机抽取一个硬币
  2. 投掷 n 次
  3. 循环 m 次

1 为正面,0 为反面

【注】:在计算概率时并没有乘以组合数,因此当n过大时,概率会精度丢失变为0导致优化失败

0n = 100
m = 1000
coin_result = np.zeros((m, n), dtype=int)

c_selected_record = []
for i_m in range(m):
    # 选择硬币
    coin_p = random.choice(coins)
    c_selected_record.append(coin_p)
    for i_n in range(n):
        # 开始投掷
        coin_result[i_m, i_n] = 1 if random.random() < coin_p else 0

coin_result.shape, Counter(c_selected_record)

EM算法

初始化:随机初始化硬币正面的概率

  1. E步:计算当前硬币的期望
  2. M步:更新硬币参数

为了便于实现,修改概率计算方式,结果不变:

p n 1 × ( 1 − p ) n 2 = e x p ( n 1 × log ⁡ ( p ) + n 2 × log ⁡ ( 1 − p ) ) p^{n_1}\times (1-p)^{n_2} \\ =exp(n_1 \times \log(p) + n_2 \times \log(1-p)) pn1×(1p)n2=exp(n1×log(p)+n2×log(1p))

【注】:预测的硬币并不是一一对应,顺序会变

ini_coin_theta = np.array([random.randint(1, 99)/100 for _ in range(coin_num)])
# coin_theta = np.array([0.2, 0.9])
print('ini coin:', ini_coin_theta)

def E(coin_theta, coin_result):
    
    h_e_sum = np.zeros_like(coin_theta)
    t_e_sum = np.zeros_like(coin_theta)
    
    h_num = coin_result.sum(1)[:, None]
    t_num = coin_result.shape[1] - h_num
    
    # 可以评估每个硬币的得分
    coin_selected_p = h_num @ np.log(coin_theta[None]) + t_num @ np.log(1 - coin_theta[None])
    coin_selected_p = np.exp(coin_selected_p)
    coin_selected_p = coin_selected_p / coin_selected_p.sum(1)[:, None]
    
    h_e = coin_selected_p  * h_num
    t_e = coin_selected_p  * t_num
    
    return h_e.sum(0), t_e.sum(0), coin_selected_p

def M(h_e_sum, t_e_sum):
    return h_e_sum / (h_e_sum + t_e_sum)

max_step=1000
coin_result = np.array(coin_result)

h_e_record = []
t_e_record = []
theta_record = []
delta_record = []

coin_theta = ini_coin_theta
for i in tqdm(range(max_step)):
    h_e_sum, t_e_sum, coin_selected_p = E(coin_theta, coin_result)
    
    h_e_record.append(h_e_sum)
    t_e_record.append(t_e_sum)
    
    new_coin_theta = M(h_e_sum, t_e_sum)
    
    theta_record.append(new_coin_theta)
    
    delta =  ((new_coin_theta - coin_theta)**2).sum()
    
    delta_record.append(delta)
    
    # print(new_coin_theta)
    if delta < 1e-10:
        break
    coin_theta = new_coin_theta
    

h_e_record = np.array(h_e_record)
t_e_record = np.array(t_e_record)
theta_record = np.array(theta_record)
delta_record = np.array(delta_record)
    
i, coin_theta, coins

'''
(36,
 array([0.62988197, 0.43099465, 0.84265886, 0.99086422, 0.53815304]),
 [0.84, 0.99, 0.63, 0.44, 0.54])
'''

展示参数变化过程

def plot_list(f, x, y, labels, title):
    f.set_title(title)
    for i in range(y.shape[1]):
        f.plot(x, y[:, i], label = labels[i], linestyle='--')

index = range(0, i+1)
labels = list(range(coin_theta.shape[0]))
figure, axes = plt.subplots(2, 2, figsize=(12,12), dpi=80)


axes[0, 0].set_title("delta")
# 与上一步结果的差别
axes[0, 0].plot(index, delta_record, label="delta")
# 硬币正面的概率
plot_list(axes[0, 1], index, theta_record, labels=labels, title="theta")
# 每个硬币正面的加权和
plot_list(axes[1, 0], index, h_e_record, labels=labels, title="h_e")
# 每个硬币反面的加权和
plot_list(axes[1, 1], index, t_e_record, labels=labels, title="t_e")

for axe in axes:
    for a in axe:
        a.legend()

在这里插入图片描述

源文件

HMTTT/EM-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里P8终于整理出:Nginx+jvm+MySQL+Docker+Spring实战技术文档

前言 都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升…

Java搭建实战毕设项目springboot停车位管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕设项目springboot停车位管理系统源码&#xff0c;适合拿来做毕业设计的同学。可以下载来研究学习一下&#xff0c;本期把这套系统分享给大家。 技术架构 技术框架&#xff1a;jQu…

报表控件ActiveReports帮助高校实现办公、财务管理数字化

国内某知名高校教务处 陈主任&#xff1a; “我们教务处有十分多的文件、文档需要归纳整理&#xff0c;包括整个学校的文件通知公告、一些教务资源、职工工作日志记录、职工考勤记录等&#xff0c;同时还涉及一部分财务信息&#xff0c;职工的工资核算、学生续费的收纳等&…

初始python国度

print()函数 我里面有一个你可以直接使用的函数叫print()&#xff0c;可以将你想展示的东东在IDLE或标准的控制台上显示 print()函数可以输出哪些内容? (1)print()函数输出的内容可以是数字 (2)print()函数输出的内容可以是字符串 (3)print()函数输出的内容可以是含有运算符…

模拟电子技术(八)功率放大电路

&#xff08;四&#xff09;放大电路的频率响应电路基础复习功率放大电路的特点功率放大电路的分类互补功率放大电路&#xff08;OCL&#xff09;OCL的计算分析电路基础复习 功率放大电路的特点 以共射放大电路为例 电源功率消耗在了输出回路中&#xff08;Rb上的忽略&#…

智慧天气系统 - 可视化大屏(Echarts)管理系统(HTTP(S)协议)物联网平台(MQTT协议)

一. 智慧天气系统功能定义 天气数据实时监控&#xff0c;实时视频监控&#xff0c;历史数据分析&#xff1b;电子地图&#xff0c;设备地理位置精确定位&#xff1b;多级组织结构管理&#xff0c;满足集团大客户需求&#xff1b;可视化大屏展示&#xff0c;数据指标一目了然&am…

前端小技能:Chrome DevTools中的操作技巧

文章目录 前言I 操作技巧1.1 编辑页面上的任何文本 ✍1.2 清空缓存并硬性重新加载1.3 Command 菜单see aslo前言 Mac 使用 command+option+I 即可打开DevTools I 操作技巧 1.1 编辑页面上的任何文本 ✍ 在控制台输入document.body.contentEditable="true"开启文本…

计算机视觉 神经网络基础理论

1.感受野 输出featuremap上的一个像素点在输入图上的映射区域的大小。 计算公式&#xff1a; lk1lk[(fk1−1)∗∏i1ksi] , 为前层的步长之积∏i1ksi为前k层的步长之积第层对应的感受野大小&#xff0c;第层的卷积核的大小&#xff0c;或为池化尺寸大小lk第k层对应的感受野大小…

【C++】特殊类相关设计

前言 在实际的应用场景中&#xff0c;不免会有一些特殊的设计要求存在。在C中&#xff0c;由于三种不同的域&#xff0c;以及地址空间的大小或者申请方式不同&#xff0c;就衍生出了一些特殊的设计类方法。 何为特殊呢&#xff1f;即区别于普通类的设计。 上一篇C笔记传送门~ 【…

[附源码]计算机毕业设计的高校资源共享平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

第二证券|抗原检测板块暴涨,又是20CM涨停!

抗原检测概念起飞&#xff0c;组织以为&#xff0c;抗原检测在国内疫情防控中的重要性有望逐渐提高&#xff0c;主张重视板块潜在的市场需求。 抗原检测板块掀涨停潮 9日&#xff0c;抗原检测概念开盘冲高&#xff0c;到午间收盘&#xff0c;天瑞仪器、英诺特20CM涨停&#xf…

期权量化策略:如何利用期权捕捉期现套利机会?

做期权的朋友请看过来&#xff01;当前与掘金量化合作的特定券商已经能够支持期权数据和交易接口啦~如需开展期权量化&#xff0c;请联系我了解更多详情。 本期我们将和大家分享一个策略&#xff0c;介绍如何利用期权进行自动化套利。 期现套利是指某种期货合约&#xff0c;当…

浅谈linux 内核网络 sk_buff 之克隆与复制

【推荐阅读】 需要多久才能看完linux内核源码&#xff1f; 概述Linux内核驱动之GPIO子系统API接口 一文了解Linux内核的Oops 一篇长文叙述Linux内核虚拟地址空间的基本概括 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 1 skb_clone() 函…

1X的示波器探头为什么会降低示波器带宽

有些无源示波器探头分为1X和10X两个挡位&#xff0c;比如这个探头&#xff0c;这里有个按钮可以选择1X或者10X&#xff0c; 1X表示测量的信号不在探头衰减&#xff0c;同时示波器的通道选项也不用放大&#xff0c;10X表示测量的信号在探头衰减10倍&#xff0c;同时示波器的通道…

Spring Boot的两种配置文件

⭐️前言⭐️ Spring Boot项目中重要的数据都是在配置文件中配置的&#xff0c;下边我们就来学习SpringBoot中的配置文件的具体详情。 &#x1f349;博客主页&#xff1a; &#x1f341;【如风暖阳】&#x1f341; &#x1f349;精品Java专栏【JavaEE进阶】、【JavaEE初阶】、…

2.5D游戏,角色移动限制方法。不用空气墙。

有一个项目&#xff0c;2.5D视角。角色在设定好的路线上自由移动&#xff0c;不能超出路线。 之前的做法是用空气墙&#xff0c;设定物理碰撞&#xff0c;然后角色移动。 我感觉这种做法性能有点低。手机上体验平均帧时是4ms 于是想用空间换时间&#xff0c;将可能的运算进行预…

chrome 如何下载网站在线预览PDF文件,保存到本地

爱学习的小伙伴肯定遇到过那种只能在线看&#xff0c;但并不提供下载的的PDF文件&#xff01; 但有时候想保存到本地有很费劲。今天准备了一个很简单的方法 以这个在线pdf为例 在线PDF文件 该如何把这个PDF保存到本地呢~ 方法 1.以chrome浏览器为例&#xff0c;打开准备好的示…

iOS运行时Runtime在OC中的应用场景

本篇将会总结Rutime的具体应用实例&#xff0c;结合其动态特性&#xff0c;Runtime在开发中的应用大致分为以下几个方面&#xff1a; 一、动态方法交换&#xff1a;Method Swizzling 实现动态方法交换(Method Swizzling )是Runtime中最具盛名的应用场景&#xff0c;其原理是&a…

SpringBoot2.0中MVC和WebFlux控制层Controller对比

本篇文章是SpringBoot2.0关于Controller控制层的对比&#xff0c;相信很多开发最好奇的也是这块。那么小编就带着大家一起先来看一下尝尝鲜,本篇文章比较短小精悍,只讲如何使用,至于原理剖析,后面会讲。阅读时间大概3分钟,现在开始! 文章目录一、演示目录结构二、演示启动类定义…

昨天阅读量900多

今日阅读量还不错的样子&#xff0c;也有900多了&#xff0c;