当前位置: 首页 > 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 plt

2. 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_B

2.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_B

2.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'], label='Coin A') plt.plot(history['B'], label='Coin B') plt.xlabel('Iteration') plt.ylabel('Estimated Probability') plt.legend() plt.show()

运行后你会发现,经过几次迭代后,θₐ和θᵦ就会收敛到稳定值。在我的实验中,最终收敛到:

  • 硬币A正面概率:≈0.71
  • 硬币B正面概率:≈0.58

3. 算法原理解析

3.1 为什么EM能解决这类问题

EM算法之所以能处理含有隐变量的问题,关键在于它通过迭代的方式逐步逼近真实参数:

  1. E步:基于当前参数,计算隐变量的后验分布(即我们的prob_A和prob_B)
  2. M步:基于这个分布,更新参数使期望似然最大化

这个过程就像是在不断"猜测"隐变量的值(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_components=2, max_iter=100) gmm.fit(data) print(f"均值: {gmm.means_.ravel()}") print(f"方差: {gmm.covariances_.ravel()}")

这里EM算法的工作流程与硬币问题惊人地相似:

  1. E步:计算每个数据点属于各个高斯分布的概率
  2. M步:基于这些概率重新估计高斯分布的参数

5. 实战技巧与常见问题

5.1 EM算法的局限性

虽然EM算法很强大,但也有几点需要注意:

  • 初始值敏感:不同的初始值可能导致收敛到不同的局部最优解
  • 收敛速度:有时收敛较慢,特别是接近最优解时
  • 隐变量选择:需要合理设计隐变量结构

5.2 改进策略

针对这些问题,可以尝试以下方法:

  1. 多次初始化:随机初始化多次,选择似然最大的结果
  2. 加速技巧:使用加速EM变种或结合梯度方法
  3. 模型选择:通过BIC等准则确定合适的隐变量维度
# 示例:使用BIC选择GMM的最佳组件数 bic_values = [] n_components_range = range(1, 8) for n_components in n_components_range: gmm = GaussianMixture(n_components=n_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.jsqmd.com/news/875899/

相关文章:

  • DLSS Swapper终极指南:一键智能管理游戏DLSS版本
  • Pangle签名算法逆向:用unidbg动态分析so层签名逻辑
  • 百度网盘直链解析技术实现与高速下载架构设计
  • 保姆级教程:在Ubuntu 22.04上从源码编译llama.cpp,并成功运行中文模型
  • 2026靠谱奢侈品回收地址大汇总,上门回收名贵奢侈品价格多少 - mypinpai
  • 构建鲁棒机器学习系统:MLOps实战中的数据漂移、模型监控与自动化应对
  • 从博弈论到Python代码:手把手拆解SHAP值计算,告别‘调包侠’
  • ALE与SHAP结合:从黑盒模型到可解释灰盒的实战指南
  • 技能清单SkillsList
  • 2026哈尔滨修汽车减震打气泵靠谱门店汇总,选哪家 - mypinpai
  • DVWA靶场实战避坑指南:Docker环境搭建与四层安全等级解析
  • 基于Gaia DR3光变曲线与贝叶斯回归的天琴RR变星金属丰度估算
  • GHelper深度解析:如何用轻量级控制中心彻底优化华硕笔记本性能与散热
  • 基于势能面描述符与机器学习势的高通量固态电解质筛选方法
  • 别再死磕公式了!用Python和PyTorch手把手复现DDPM图像去噪(附完整代码)
  • 腾讯点选VMP环境补全与Hook实战:构建可信浏览器沙盒
  • 如何选择性价比高的全屋定制供应商,源头全屋定制厂家攻略揭秘 - mypinpai
  • NVIDIA Profile Inspector终极指南:5步解锁显卡隐藏功能,轻松提升游戏性能30%
  • ContextMenuManager:三步彻底掌控Windows右键菜单的终极免费工具
  • 2026年目前可靠的邓州室内装修品牌哪家好 - 品牌排行榜
  • 分子动力学模拟揭秘:非晶材料断裂韧性的原子尺度起源
  • GHelper架构设计与风扇控制技术深度解析:构建华硕笔记本轻量级系统优化解决方案
  • 企业级MCP Server OAuth接入实战:租户隔离与IDP适配
  • 基于局部交叉对称色散关系的弦振幅参数化表示与数值引导
  • 性价比高的CPE流延高透膜设备先进的加工厂盘点,哪家比较靠谱 - mypinpai
  • ContextMenuManager:让Windows右键菜单从此清爽高效
  • ContextMenuManager:重新定义Windows右键菜单的交互设计思维
  • 2025-2026年产业园区公司联系电话推荐:精选资源与联系指南 - 品牌推荐
  • 广东白云学院登录接口逆向实战:DES-CBC动态密钥与高校系统反爬细节
  • 2025-2026年王雯律师电话查询:委托前请核实执业资质与收费标准 - 品牌推荐