当前位置: 首页 > article >正文

别再死记硬背EM算法了!用Python手写一个硬币实验,5分钟搞懂E步和M步

用Python实现EM算法从硬币实验到高斯混合模型实战很多人在学习EM算法时都会被复杂的数学推导劝退。但今天我要带你用Python手写一个硬币实验通过不到50行代码直观理解E步和M步的奥妙。我们不仅会复现经典的双硬币问题还会延伸到scikit-learn中的高斯混合模型应用让你真正掌握这个算法的精髓。1. 准备工作理解问题场景假设你面前有两个不均匀的硬币A和B但每次投掷时都有人随机选择一个硬币给你你不知道是哪个。你记录了5轮投掷结果每轮投掷10次第一轮5正5反第二轮9正1反第三轮8正2反第四轮4正6反第五轮7正3反我们的目标是通过这些观测数据估计出硬币A和B各自的正面向上的概率θₐ和θᵦ。这就是典型的含有隐变量每次选择的硬币的参数估计问题正是EM算法大显身手的地方。核心工具准备import numpy as np from collections import defaultdict import matplotlib.pyplot as plt2. EM算法实现从理论到代码2.1 初始化参数我们随机初始化两个硬币的正面向上的概率并定义观测数据# 初始猜测 theta_A 0.6 # 硬币A正面向上的初始概率 theta_B 0.5 # 硬币B正面向上的初始概率 # 观测数据每轮投掷的正反面次数 observations np.array([ [5, 5], # 第一轮 [9, 1], # 第二轮 [8, 2], # 第三轮 [4, 6], # 第四轮 [7, 3] # 第五轮 ])2.2 E步计算隐变量分布E步的核心是计算在当前参数下每轮投掷来自硬币A或B的概率def e_step(obs, theta_a, theta_b): # 计算每轮来自A和B的概率 prob_A np.zeros(len(obs)) prob_B np.zeros(len(obs)) for i, (h, t) in enumerate(obs): # 计算似然P(data|θ) likelihood_A (theta_a**h) * ((1-theta_a)**t) likelihood_B (theta_b**h) * ((1-theta_b)**t) # 归一化得到概率 total likelihood_A likelihood_B prob_A[i] likelihood_A / total prob_B[i] likelihood_B / total return prob_A, prob_B2.3 M步更新参数估计M步则根据E步得到的概率重新估计θₐ和θᵦdef m_step(obs, prob_A, prob_B): # 计算加权后的正反面次数 total_A_h 0 total_A_t 0 total_B_h 0 total_B_t 0 for (h, t), pa, pb in zip(obs, prob_A, prob_B): total_A_h h * pa total_A_t t * pa total_B_h h * pb total_B_t t * pb # 更新参数 new_theta_A total_A_h / (total_A_h total_A_t) new_theta_B total_B_h / (total_B_h total_B_t) return new_theta_A, new_theta_B2.4 迭代过程可视化让我们运行10次迭代并观察参数的变化history {A: [], B: []} for _ in range(10): # E步 prob_A, prob_B e_step(observations, theta_A, theta_B) # M步 theta_A, theta_B m_step(observations, prob_A, prob_B) # 记录历史 history[A].append(theta_A) history[B].append(theta_B) # 绘制收敛过程 plt.plot(history[A], labelCoin A) plt.plot(history[B], labelCoin B) plt.xlabel(Iteration) plt.ylabel(Estimated Probability) plt.legend() plt.show()运行后你会发现经过几次迭代后θₐ和θᵦ就会收敛到稳定值。在我的实验中最终收敛到硬币A正面概率≈0.71硬币B正面概率≈0.583. 算法原理解析3.1 为什么EM能解决这类问题EM算法之所以能处理含有隐变量的问题关键在于它通过迭代的方式逐步逼近真实参数E步基于当前参数计算隐变量的后验分布即我们的prob_A和prob_BM步基于这个分布更新参数使期望似然最大化这个过程就像是在不断猜测隐变量的值E步然后基于这个猜测优化参数M步如此循环直到收敛。3.2 数学保证EM算法有一个美妙的性质每次迭代都会保证对数似然函数不减。这是因为E步构建了一个对数似然的下界函数Q函数M步通过最大化这个下界函数来提升原始似然用数学表示就是logP(X|θ⁽ᵗ⁺¹⁾) ≥ logP(X|θ⁽ᵗ⁾)4. 工业级应用高斯混合模型理解了硬币问题后我们来看一个更实际的例子——高斯混合模型(GMM)。在scikit-learn中GMM就是使用EM算法实现的from sklearn.mixture import GaussianMixture # 生成模拟数据 np.random.seed(42) data np.concatenate([ np.random.normal(0, 1, 300), np.random.normal(5, 1.5, 200) ])[:, np.newaxis] # 使用EM算法拟合GMM gmm GaussianMixture(n_components2, max_iter100) gmm.fit(data) print(f均值: {gmm.means_.ravel()}) print(f方差: {gmm.covariances_.ravel()})这里EM算法的工作流程与硬币问题惊人地相似E步计算每个数据点属于各个高斯分布的概率M步基于这些概率重新估计高斯分布的参数5. 实战技巧与常见问题5.1 EM算法的局限性虽然EM算法很强大但也有几点需要注意初始值敏感不同的初始值可能导致收敛到不同的局部最优解收敛速度有时收敛较慢特别是接近最优解时隐变量选择需要合理设计隐变量结构5.2 改进策略针对这些问题可以尝试以下方法多次初始化随机初始化多次选择似然最大的结果加速技巧使用加速EM变种或结合梯度方法模型选择通过BIC等准则确定合适的隐变量维度# 示例使用BIC选择GMM的最佳组件数 bic_values [] n_components_range range(1, 8) for n_components in n_components_range: gmm GaussianMixture(n_componentsn_components) gmm.fit(data) bic_values.append(gmm.bic(data)) best_n n_components_range[np.argmin(bic_values)] print(f最佳组件数: {best_n})6. 扩展应用场景EM算法在机器学习中有着广泛的应用以下是一些典型例子缺失数据处理将缺失值视为隐变量文本建模主题模型中的LDA算法计算机视觉图像分割中的混合模型生物信息学基因序列分析比如在主题模型中E步计算文档中每个词属于各个主题的概率M步则更新主题的词分布和文档的主题分布。这与我们的硬币问题在数学形式上高度一致。

相关文章:

别再死记硬背EM算法了!用Python手写一个硬币实验,5分钟搞懂E步和M步

用Python实现EM算法:从硬币实验到高斯混合模型实战 很多人在学习EM算法时,都会被复杂的数学推导劝退。但今天我要带你用Python手写一个硬币实验,通过不到50行代码直观理解E步和M步的奥妙。我们不仅会复现经典的双硬币问题,还会延伸…...

如何彻底解决洛雪音乐音源失效问题:六音音源修复完全指南

如何彻底解决洛雪音乐音源失效问题:六音音源修复完全指南 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 还在为洛雪音乐1.6.0版本后无法正常播放音乐而烦恼吗?六音音源修…...

DLSS Swapper终极指南:免费开源的DLSS文件智能管理工具

DLSS Swapper终极指南:免费开源的DLSS文件智能管理工具 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经遇到过这样的困扰:你心爱的游戏明明支持DLSS技术,但游戏自带的DLSS…...

英雄联盟智能助手Seraphine:从青铜到王者的游戏效率革命 [特殊字符]

英雄联盟智能助手Seraphine:从青铜到王者的游戏效率革命 🎮 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 还在为错过排位对局而懊恼吗?还在BP阶段手忙脚乱查询对手战绩吗…...

量子机器学习中的偏见:从编码到测量的系统性挑战与缓解策略

1. 量子机器学习中的偏见:一个被忽视的工程挑战量子机器学习(QML)正从理论实验室走向现实应用,从药物分子筛选到金融衍生品定价,其潜力令人兴奋。然而,作为一名长期关注量子算法落地的从业者,我…...

机器学习辅助第一性原理:高精度计算电化学氧化还原电位

1. 项目概述:当机器学习遇上第一性原理,破解电化学模拟的精度瓶颈在电化学、材料科学和计算化学的交叉领域,预测一个分子或离子在溶液中的氧化还原电位,就像试图在暴风雨中测量一滴雨滴的精确落点。这个数值,直接决定了…...

布里渊散射与机器学习势场协同表征MOF力学性能

1. 项目概述:当布里渊散射遇见机器学习势场在材料科学的前沿探索中,我们常常面临一个核心挑战:如何精确、无损地获取复杂材料的本征力学性能,尤其是那些结构精巧但晶体尺寸微小的新材料。金属有机框架(MOFs&#xff09…...

神经符号系统实践:耦合机器学习与本体论提升机器人自主诊断能力

1. 项目概述:当机器学习遇见本体论 在机器人圈子里摸爬滚打十几年,我见过太多“聪明”但“不可靠”的自主系统。它们能精准识别物体、规划路径,但一旦遇到训练数据之外的场景,或者传感器出现一点小毛病,行为就可能变得…...

鲸震恩!DeepSeek V4 价格永久“打骨折”,网友疯狂“表白”:梁圣的恩情还不完

①2026 年 5 月 22 日 20:36,DeepSeek 官宣,deepseek-v4-pro 模型 API 价格将于北京时间 2026/05/31 23:59 结束 2.5 折优惠活动后,正式调整为原定价的 1/4。也就是说,从 6 月 1 日起当前 2.5 折直接变成常态价了。在上次&#xf…...

Linux 文本三剑客组合实战(grep + sed + awk)

前言 Linux 文本处理三剑客: grep:过滤、筛选行(抓出想要的内容)sed:替换、删除、修改文本(批量改内容)awk:按列截取、统计、计算(取字段、做统计) 真正工…...

GitHub界面本地化:从语言障碍到无障碍协作的技术演进

GitHub界面本地化:从语言障碍到无障碍协作的技术演进 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 对于众多中文开发者而…...

量子核方法:从经典核技巧到量子特征映射的实践指南

1. 量子核方法:从理论到实践的跨越 核方法在机器学习领域已经是一个相当成熟的技术,它的核心魅力在于“核技巧”——通过一个巧妙的函数,我们可以在不显式计算高维甚至无限维特征向量的情况下,直接得到它们的内积。这让我们能用线…...

非Root安卓设备上使用Frida Gadget实现应用层Hook

1. 为什么非Root设备上Hook安卓App不再是“不可能任务”很多人第一次听说Frida,脑海里自动浮现出的场景是:一台已Root的测试机、adb shell里敲着su、frida-server在后台静静运行、然后用frida-trace监听onCreate——一套行云流水的操作,但前提…...

Unity Android读取SD卡图片的5种实战方案与选型指南

1. 为什么在 Unity Android 上“读取 sdcard 图片”会让人反复踩坑? “Unity Android 读取 sdcard 路径下指定文件夹的所有图片”——这句话看似平平无奇,但凡是真正在项目里做过相册预览、本地图库导入、离线资源加载、用户截图归档这类功能的开发者&am…...

去偏机器学习在左截断右删失数据因果生存分析中的应用

1. 项目概述:当生存分析遇上复杂数据与因果推断在生物医学、流行病学乃至社会科学研究中,我们常常关心一个关键事件发生的时间:从接受某种治疗到疾病复发,从开始暴露于某种风险因素到出现特定结局,或者从产品发布到用户…...

从博弈论到可解释AI:Shapley值及其交互指数的原理与应用

1. 从博弈论到可解释AI:理解Shapley值的核心思想在机器学习模型日益复杂的今天,理解一个模型为何做出某个预测,其重要性不亚于模型本身的性能。想象一下,你训练了一个精准的房价预测模型,当它判断某套房子价值500万时&…...

UFLUX v2.0:融合P模型与XGBoost的GPP估算混合建模框架

1. 项目概述与核心价值如果你正在从事全球变化生态学、碳循环研究或者遥感应用领域的工作,那么“如何更准确地估算陆地生态系统的总初级生产力”这个问题,大概率是你绕不开的挑战。总初级生产力,也就是我们常说的GPP,它衡量的是植…...

IGND算法:融合高斯牛顿法与增量学习的优化新范式

1. IGND算法:当高斯牛顿法遇见增量学习在机器学习的世界里,模型训练的本质就是一场持续的优化之旅。我们手握一个由参数构成的复杂函数,目标是在浩瀚的参数空间中,找到那个能让预测误差最小化的“甜蜜点”。多年来,随机…...

BetterGI原神自动化工具:5大核心功能让你每天节省2小时游戏时间

BetterGI原神自动化工具:5大核心功能让你每天节省2小时游戏时间 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连…...

DVWA靶场实战避坑指南:Docker环境搭建与四层安全等级解析

1. 这不是“又一个DVWA教程”,而是一份能让你在真实渗透测试中少走三周弯路的靶场操作手册很多人第一次接触渗透测试,打开浏览器输入http://192.168.1.10/dvwa,看到那个灰扑扑的登录页,就以为自己已经站在了红队门口。结果刚点开S…...

保姆级避坑指南:用Python处理泰坦尼克号数据时,90%新手都会犯的5个错误

保姆级避坑指南:用Python处理泰坦尼克号数据时,90%新手都会犯的5个错误泰坦尼克号数据集是Kaggle上最经典的机器学习入门项目之一,但看似简单的数据背后却暗藏无数新手陷阱。我曾辅导过数百名数据科学初学者,发现他们在处理这个数…...

别再被异常值坑了!用Python+OpenCV手把手教你实现RANSAC直线拟合(附完整代码)

实战PythonOpenCV:用RANSAC算法驯服异常值的终极指南当你面对一堆被噪声和异常点污染的数据点时,传统的最小二乘法就像是用放大镜找蚂蚁——稍微有点干扰就彻底失效。想象一下这样的场景:你正在处理来自传感器的二维坐标数据,或者…...

CVPR 2023新作DoNet实战:用Python+Detectron2搞定重叠细胞分割(附代码)

DoNet实战指南:基于Detectron2的细胞重叠分割全流程解析医学图像分析领域近年来迎来爆发式增长,其中细胞实例分割作为基础性技术,在癌症筛查、药物研发等场景中扮演关键角色。然而传统方法面对细胞重叠、半透明边界等复杂情况时往往表现不佳。…...

BetterGI原神自动化工具:5分钟轻松上手指南,彻底解放你的游戏时间!

BetterGI原神自动化工具:5分钟轻松上手指南,彻底解放你的游戏时间! 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集…...

JTAG链式连接原理与ULINK2调试配置实战

1. JTAG设备链式连接的核心原理在嵌入式系统开发中,JTAG(Joint Test Action Group)接口是最常用的调试和编程接口之一。当系统中存在多个JTAG设备时,我们需要通过链式连接(Chaining)的方式将它们串联起来。…...

ContextMenuManager:三步彻底掌控Windows右键菜单的终极免费工具

ContextMenuManager:三步彻底掌控Windows右键菜单的终极免费工具 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否每天都要在Windows右键菜单中…...

ContextMenuManager:Windows右键菜单终极管理指南,让你的电脑效率翻倍

ContextMenuManager:Windows右键菜单终极管理指南,让你的电脑效率翻倍 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否厌倦了Windo…...

Java并发工具类CountDownLatch与CyclicBarrier

前言 在现代软件开发中,Java并发工具类CountDownLatch与CyclicBarrier是一个非常重要的技术点。本文将从原理到实践,带你深入理解这一技术,并通过完整的代码示例帮助你快速掌握核心知识点。 核心概念 基本原理 Java并发工具类CountDownLatch与…...

ContextMenuManager:重新定义Windows右键菜单的交互设计思维

ContextMenuManager:重新定义Windows右键菜单的交互设计思维 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 在数字工作流中,我们每天平均…...

[智能体-26]:ollama, 让模型的部署和提供服务(远程或本地)变得异常简单

极简一键部署,自动封装OpenAI 标准 API,本地 / 远程服务秒启用,无需复杂环境编译、配置端口、适配接口。核心亮点安装零门槛跨 Windows/Mac/Linux,一键安装包,无需 CUDA、Python 环境预处理。模型一键拉取运行bash运行…...