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

别再死记硬背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步则更新主题的词分布和文档的主题分布。这与我们的硬币问题在数学形式上高度一致。
http://www.gsyq.cn/news/1364616.html

相关文章:

  • DLSS Swapper终极指南:免费开源的DLSS文件智能管理工具
  • 别光看MLP了!手把手带你用Python复现KAN网络,实测拟合效果到底有多强
  • 边缘计算中LLM推理优化:CLONE方案解析
  • 半监督学习在海洋异常检测中的实践与优化
  • Cortex-A53双比特错误注入与统计机制详解
  • Windows API测试便携工具:基于WinHTTP的零依赖HTTP调试方案
  • JMeter高并发压测的业务建模方法论
  • LDA降维在信用风险评估中的实战应用与模型性能提升
  • 量子机器学习中的几何优化:从贫瘠高原理论到量子自然梯度实践
  • 量子机器学习在药物发现中的优势:小样本与特征缺失场景下的性能突破
  • 安卓13+VMOSPro双环境HttpCanary抓包实战指南
  • 归一化评估指标:解决小数据与不平衡数据模型评估难题
  • Python移动端反爬实战:Charles+Frida+签名复现全链路
  • 非Root安卓设备上使用Frida Gadget实现应用层Hook
  • KBE登录异常排查:baseapp通信故障定位指南
  • BetterGI:原神自动化辅助工具深度使用指南
  • 如何选择北京装修设计公司?2026年5月推荐TOP5对比避坑案例适用场景 - 品牌推荐
  • 神船笔记本Win10开机报错‘reboot and select proper boot device’?别急着重装,试试这个GPT/MBR无损互转的骚操作
  • 国产麒麟系统上编译GDAL库踩坑实录:从PROJ6缺失到Qt工程配置的完整避坑指南
  • 2026年大学生必备:如何快速降低论文AIGC率和查重率? - 降AI实验室
  • 哪家北京装修设计公司专业?2026年5月推荐TOP5对比防踩坑案例适用场景 - 品牌推荐
  • 基于势能面描述符与机器学习势的高通量固态电解质筛选方法
  • 机器学习预测分子液体介电性质:从Wannier中心到THz光谱解析
  • 5大核心功能揭秘:BetterGI原神自动化工具完整使用指南
  • 别再只盯着实体了!用Python+Neo4j手把手教你构建一个‘会讲故事’的事理知识图谱
  • BetterGI原神自动化工具:5大核心功能让你每天节省2小时游戏时间
  • 2026年5月北京老房改造装修公司推荐:十大排名评测专业价格适用场景 - 品牌推荐
  • 去偏机器学习在左截断右删失数据因果生存分析中的应用
  • 从博弈论到可解释AI:Shapley值及其交互指数的原理与应用
  • IGND算法:融合高斯牛顿法与增量学习的优化新范式