51-机器学习与大模型开发数学教程-4-13 EM算法与混合模型

一句话版:当模型里有看不见的变量 (聚类标签、缺失值、隐状态......)时,直接最大化似然很难。EM 用"先求期望(E 步) + 再极大化(M 步) "交替优化一个下界,让对数似然单调不降 。在工程上,高斯混合 GMM、隐马尔可夫 HMM、带缺失的数据拟合都是它的主场。


1. 看不见的"Z"从哪来?

  • 聚类 :每个样本 xix_ixi 来自哪个簇?------隐变量 zi∈{1,...,K}z_i\in\{1,\dots,K\}zi∈{1,...,K}。
  • 缺失数据:特征缺失,把缺失部分当隐变量。
  • 结构化序列 :HMM 中每个时刻的隐状态 ztz_tzt。
  • 混合专家/回归:每个样本由哪个"专家"回归器生成?

类比:你在自助餐挑食(观测 xxx),却没看见厨师(隐变量 zzz)。EM 让你在"猜厨师是谁"和"依照厨师的习惯做菜"之间来回迭代,直到稳定。


2. EM 的一般配方(Jensen 不等式视角)

观测数据 X={xi}i=1nX=\{x_i\}_{i=1}^nX={xi}i=1n,隐变量 ZZZ,参数 θ\thetaθ。目标是最大化

log⁡pθ(X)=log⁡∑Zpθ(X,Z). \log p_\theta(X)=\log \sum_Z p_\theta(X,Z). logpθ(X)=logZ∑pθ(X,Z).

对任意分布 q(Z)q(Z)q(Z) 有变分下界(ELBO)

log⁡pθ(X)  ≥  Eq(Z)[log⁡pθ(X,Z)]+H(q)⏟F(q,θ). \log p_\theta(X) \;\ge\; \underbrace{\mathbb{E}{q(Z)}[\log p\theta(X,Z)] + H(q)}_{\mathcal{F}(q,\theta)}. logpθ(X)≥F(q,θ) Eq(Z)[logpθ(X,Z)]+H(q).

  • E 步 :固定 θold\theta^{\text{old}}θold,最优 q⋆(Z)=pθold(Z∣X)q^\star(Z)=p_{\theta^{\text{old}}}(Z\mid X)q⋆(Z)=pθold(Z∣X)(把后验塞进来,ELBO 最紧)。

  • M 步 :固定 qqq,最大化 F(q,θ)\mathcal{F}(q,\theta)F(q,θ);因 H(q)H(q)H(q) 与 θ\thetaθ 无关,等价于最大化

    Q(θ∣θold)=EZ∼pθold(Z∣X)[log⁡pθ(X,Z)]. Q(\theta\mid \theta^{\text{old}})=\mathbb{E}{Z\sim p{\theta^{\text{old}}}(Z\mid X)}[\log p_\theta(X,Z)]. Q(θ∣θold)=EZ∼pθold(Z∣X)[logpθ(X,Z)].

  • 收敛性 :每次 E、M 交替都会让 log⁡pθ(X)\log p_\theta(X)logpθ(X) 不下降(单调收敛到局部极值/鞍点)。


收敛
初始化 θ
E 步: 计算 q(Z)=p(Z|X,θ)
M 步: 最大化 Q(θ|θ_old)
对数似然增大?
输出 θ, q

说明:EM 在"推断隐变量后验"和"最大化完全数据似然的期望"之间循环。


3. 高斯混合模型(GMM):EM 的教科书级应用

3.1 模型

p(x)=∑k=1Kπk N(x∣μk,Σk),∑kπk=1, πk≥0. p(x)=\sum_{k=1}^K \pi_k \,\mathcal{N}(x\mid \mu_k,\Sigma_k),\quad \sum_k \pi_k=1,\ \pi_k\ge 0. p(x)=k=1∑KπkN(x∣μk,Σk),k∑πk=1, πk≥0.

引入隐变量 zik∈{0,1}z_{ik}\in\{0,1\}zik∈{0,1} 表示"样本 iii 属于第 kkk 簇"。

3.2 E 步(责任度 / 软分配)

rik  =  p(zik=1∣xi,θold)=πk N(xi∣μk,Σk)∑j=1Kπj N(xi∣μj,Σj). r_{ik} \;=\; p(z_{ik}=1\mid x_i,\theta^{\text{old}}) = \frac{\pi_k\,\mathcal{N}(x_i\mid \mu_k,\Sigma_k)} {\sum_{j=1}^K \pi_j\,\mathcal{N}(x_i\mid \mu_j,\Sigma_j)}. rik=p(zik=1∣xi,θold)=∑j=1KπjN(xi∣μj,Σj)πkN(xi∣μk,Σk).

3.3 M 步(加权极大似然)

令 Nk=∑i=1nrikN_k=\sum_{i=1}^n r_{ik}Nk=∑i=1nrik,则

πknew=Nkn,μknew=1Nk∑i=1nrikxi, \pi_k^{\text{new}}=\frac{N_k}{n},\qquad \mu_k^{\text{new}}=\frac{1}{N_k}\sum_{i=1}^n r_{ik}x_i, πknew=nNk,μknew=Nk1i=1∑nrikxi,

Σknew=1Nk∑i=1nrik(xi−μknew)(xi−μknew)⊤. \Sigma_k^{\text{new}}=\frac{1}{N_k}\sum_{i=1}^n r_{ik}(x_i-\mu_k^{\text{new}})(x_i-\mu_k^{\text{new}})^\top. Σknew=Nk1i=1∑nrik(xi−μknew)(xi−μknew)⊤.

(对对角/球形协方差,取对角或标量即可。)

3.4 算法小抄(数值稳健)

  • 概率密度用对数域 计算,log-sum-exp 归一。
  • 协方差矩阵加 εI\varepsilon IεI 防奇异。
  • 多次随机/ KMeans 初始化,取最高对数似然的解。
  • 选择 KKK:BIC/AIC 或留出验证集,BIC =−2log⁡L+dlog⁡n=-2\log L + d\log n=−2logL+dlogn。



数据 X
初始化 π, μ, Σ (可用 KMeans)
E 步: 责任度 r_ik
M 步: 更新 π, μ, Σ
计算对数似然
收敛?
输出参数与软簇

说明:GMM-EM 的循环:软分配 ↔ 加权更新。

3.5 与 KMeans 的关系

  • 若 Σk=σ2I\Sigma_k=\sigma^2 IΣk=σ2I 且 σ→0\sigma\to 0σ→0,E 步会趋向硬分配 (rikr_{ik}rik 变成 0/1),M 步把 μk\mu_kμk 更新为簇均值 → KMeans
  • 所以 KMeans ≈ GMM 在特定极限下的硬 EM

3.6 工程注意

  • 退化问题 :某簇 Σk→0\Sigma_k\to 0Σk→0 围住单点,似然无界增大。解决:对 Σk\Sigma_kΣk 加下界、或用MAP-EM(给 NIW 先验)。
  • 复杂度 :E 步 O(nKd2)\mathcal{O}(nKd^2)O(nKd2)(全协方差)或 O(nKd)\mathcal{O}(nKd)O(nKd)(对角)。
  • 可解释性 :πk\pi_kπk 是簇权重;μk,Σk\mu_k,\Sigma_kμk,Σk 给出簇的"中心与形状"。

4. 其他混合模型:把 "高斯" 换成你要的"厨师"

4.1 伯努利混合(文本词袋/0-1 特征)

每个簇 kkk 有参数 ϕkj=P(xj=1∣z=k)\phi_{kj}=P(x_j=1\mid z=k)ϕkj=P(xj=1∣z=k)。

  • E:同 GMM,换成伯努利概率。
  • M :ϕkj=∑irikxijNk\phi_{kj}=\dfrac{\sum_i r_{ik} x_{ij}}{N_k}ϕkj=Nk∑irikxij。

4.2 混合回归(Mixture of Regressions)

第 kkk 个分量:y∣x,z=k∼N(wk⊤x,σk2)y\mid x,z=k \sim \mathcal{N}(w_k^\top x,\sigma_k^2)y∣x,z=k∼N(wk⊤x,σk2)。

  • E :按当前 (wk,σk)(w_k,\sigma_k)(wk,σk) 计算 rikr_{ik}rik。
  • M :每个 kkk 上做加权最小二乘 更新 wkw_kwk,并更新 σk2\sigma_k^2σk2。

4.3 混合因子分析 / 混合专家(MoE)

  • MFA:每簇用低秩结构建模协方差,高维数据更高效。
  • MoE :把 πk\pi_kπk 做成 xxx 的函数(门控网络),EM 可在广义设定下求解或用梯度法。

5. HMM = EM 的序列版(Baum--Welch)

  • E 步 :用前向--后向 算法得
    γt(k)=P(zt=k∣X)\gamma_t(k)=P(z_t=k\mid X)γt(k)=P(zt=k∣X) 与 ξt(k,ℓ)=P(zt=k,zt+1=ℓ∣X)\xi_t(k,\ell)=P(z_t=k,z_{t+1}=\ell\mid X)ξt(k,ℓ)=P(zt=k,zt+1=ℓ∣X)。
  • M 步 :更新初始分布、转移矩阵 Akℓ∝∑tξt(k,ℓ)A_{k\ell}\propto \sum_t \xi_t(k,\ell)Akℓ∝∑tξt(k,ℓ),以及发射参数(高斯/离散)。
  • 一样的单调性与局部最优,常用多次初始化。

6. 半监督与缺失数据:EM 的"自然技能"

  • 半监督 :有标签样本把 rikr_{ik}rik 固定为 0/1,无标签样本照常 E 步;可用于"少量标注 + 大量未标注"的聚类/分类。
  • 缺失值 :把缺失部分当隐变量,在 E 步里用条件期望填补(或把完全数据似然取期望),M 步照常更新。
    这就是"期望最大化插补(EM Imputation)"思想。

7. 变体家族:GEM / ECM / Variational EM

  • GEM(广义 EM) :M 步不必精确最大化 QQQ,只要让它增加,数值更稳、可用一步梯度。
  • ECM/ECME:把 M 步拆成多块条件极大化(有时更好求)。
  • 变分 EM :当 p(Z∣X,θ)p(Z\mid X,\theta)p(Z∣X,θ) 不可求,限制 q(Z)q(Z)q(Z) 的形式(如因子分解),在 qqq 与 θ\thetaθ 上交替坐标上升(LDA 就是典型)。

8. 模型选择与评估

  • 挑 K:BIC/AIC、留出集似然、或以任务指标(如 NLL、聚类纯度)为准。
  • 稳定性:多次随机初始化,比较对数似然与聚类一致性(如 ARI/NMI)。
  • 可视化:2D/3D 画出均值与协方差椭圆(GMM),直观查看分量重叠与外点。

9. 小型代码骨架(GMM--EM,简化版)

python 复制代码
import numpy as np
from numpy.linalg import slogdet, inv

def log_gauss(x, mu, Sigma):
    d = x.shape[1]
    xc = x - mu
    sign, logdet = slogdet(Sigma)
    Q = np.sum(xc @ inv(Sigma) * xc, axis=1)  # (x-μ)^T Σ^{-1} (x-μ)
    return -0.5*(d*np.log(2*np.pi) + logdet + Q)

def gmm_em(X, K=3, iters=100, eps=1e-6):
    n, d = X.shape
    # 初始化:KMeans 更好,这里用随机
    rng = np.random.default_rng(0)
    mu = X[rng.choice(n, K, replace=False)]
    Sigma = np.array([np.cov(X.T)+1e-6*np.eye(d) for _ in range(K)])
    pi = np.ones(K)/K

    last_ll = -np.inf
    for _ in range(iters):
        # E-step: log 责任度
        log_r = np.stack([np.log(pi[k]) + log_gauss(X, mu[k], Sigma[k]) for k in range(K)], axis=1)  # (n,K)
        m = log_r.max(axis=1, keepdims=True)
        r = np.exp(log_r - m); r /= r.sum(axis=1, keepdims=True)

        # M-step
        Nk = r.sum(axis=0) + 1e-12
        pi = Nk / n
        mu = (r.T @ X) / Nk[:,None]
        for k in range(K):
            xc = X - mu[k]
            Sigma[k] = (xc * r[:,[k]]).T @ xc / Nk[k] + 1e-6*np.eye(d)

        # 对数似然
        ll = np.sum(m + np.log(r.sum(axis=1)))
        if ll - last_ll < eps: break
        last_ll = ll
    return pi, mu, Sigma, r

工程版要并行批量、用 Cholesky 而非 inv,并做多次重启挑最好解。


10. 常见误区(避坑清单)

  1. 把 EM 当"全局最优":EM 只保证单调上升,容易陷局部极值;务必多初始化。
  2. 协方差退化:似然无界,必须加正则/先验或设最小特征值下限。
  3. 错误比较模型 :不同 KKK 的训练对数似然不可直接比较(参数多必然更大);用 BIC/AIC 或验证集。
  4. 把软分配当硬标签:责任度有不确定性含义,直接硬化可能误导后续分析。
  5. 忽视数值稳定 :不在对数域做 E 步、协方差近奇异、inv 代替 Cholesky。
  6. 把 KMeans 当密度模型:KMeans 只最小化平方误差,不输出概率;需要概率请用 GMM。

11. 练习(含提示)

  1. 从 ELBO 推导 EM :写出 F(q,θ)\mathcal{F}(q,\theta)F(q,θ) 的 KL 分解,说明为什么 E 步取 q=p(Z∣X,θold)q=p(Z|X,\theta^{old})q=p(Z∣X,θold)。
  2. GMM--E 步推导 :从 Bayes 公式推出责任度 rikr_{ik}rik 的闭式。
  3. GMM--M 步推导 :固定 rikr_{ik}rik,对 πk,μk,Σk\pi_k,\mu_k,\Sigma_kπk,μk,Σk 最大化 QQQ,推得加权均值/协方差更新式。
  4. KMeans 极限 :证明 σ→0\sigma\to 0σ→0 下 GMM--EM 的目标退化为 KMeans 的 SSE。
  5. 混合回归:写出每个分量的加权最小二乘更新(矩阵形式)。
  6. HMM--Baum--Welch :给出 γt,ξt\gamma_t,\xi_tγt,ξt 的定义与更新公式,并说明为什么需要前向--后向。
  7. 选择 K :实现 BIC,比较 K=1...6K=1\ldots 6K=1...6 在某二维数据集的选择结果。
  8. MAP--EM:为 GMM 加 NIW 先验,写出 M 步的 MAP 更新式(贴合先验的均值和协方差)。
  9. 缺失数据 EM:在高斯回归中随机遮盖 20% 特征,写出 E 步下缺失部分的条件期望与协方差。

12. 小结

  • EM = E 步求后验期望 + M 步极大化完全数据似然的期望,保证对数似然单调不降。
  • GMM 是最经典的例子,软分配 + 加权更新即可;在 σ→0\sigma\to 0σ→0 极限退化为 KMeans
  • 在序列、缺失数据、混合回归、混合因子分析等场景,EM 都是可靠的"通用扳手"。
  • 工程要点:多初始化、对数域、正则化协方差、用 BIC/AIC 选 K ,必要时上 MAP-EM / 变分 EM / HMC

记忆口诀:"看不见就先'想象'(E),想象后去'最大化'(M),循环到像真。"

相关推荐
Fuly10242 小时前
多模态大模型应用技术栈
人工智能·深度学习·计算机视觉
Ka1Yan2 小时前
[二叉树] - 代码随想录:二叉树的统一迭代遍历
数据结构·算法·leetcode
xu_yule2 小时前
算法基础(数论)—欧拉函数
c++·算法·欧拉函数
Brduino脑机接口技术答疑2 小时前
TDCA 算法在 SSVEP 场景中的训练必要性
人工智能·算法·机器学习·脑机接口
xu_yule2 小时前
算法基础(数学)—数论
c++·算法·数论·最大公约数和最小公倍数·质数的判定·筛质数
Sheep Shaun2 小时前
二叉搜索树(下篇):删除、优化与应用
数据结构·c++·b树·算法
极简车辆控制2 小时前
基于LQR全主动七自由度全车悬架车身姿态控制
算法
悟道心2 小时前
1.自然语言处理NLP - 入门
人工智能·自然语言处理
s09071362 小时前
常用FPGA实现的图像处理算法
图像处理·算法·fpga开发