一句话版:当模型里有看不见的变量 (聚类标签、缺失值、隐状态......)时,直接最大化似然很难。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θ。目标是最大化
logpθ(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):
logpθ(X) ≥ Eq(Z)[logpθ(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)[logpθ(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 交替都会让 logpθ(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 =−2logL+dlogn=-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. 常见误区(避坑清单)
- 把 EM 当"全局最优":EM 只保证单调上升,容易陷局部极值;务必多初始化。
- 协方差退化:似然无界,必须加正则/先验或设最小特征值下限。
- 错误比较模型 :不同 KKK 的训练对数似然不可直接比较(参数多必然更大);用 BIC/AIC 或验证集。
- 把软分配当硬标签:责任度有不确定性含义,直接硬化可能误导后续分析。
- 忽视数值稳定 :不在对数域做 E 步、协方差近奇异、
inv代替 Cholesky。 - 把 KMeans 当密度模型:KMeans 只最小化平方误差,不输出概率;需要概率请用 GMM。
11. 练习(含提示)
- 从 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)。
- GMM--E 步推导 :从 Bayes 公式推出责任度 rikr_{ik}rik 的闭式。
- GMM--M 步推导 :固定 rikr_{ik}rik,对 πk,μk,Σk\pi_k,\mu_k,\Sigma_kπk,μk,Σk 最大化 QQQ,推得加权均值/协方差更新式。
- KMeans 极限 :证明 σ→0\sigma\to 0σ→0 下 GMM--EM 的目标退化为 KMeans 的 SSE。
- 混合回归:写出每个分量的加权最小二乘更新(矩阵形式)。
- HMM--Baum--Welch :给出 γt,ξt\gamma_t,\xi_tγt,ξt 的定义与更新公式,并说明为什么需要前向--后向。
- 选择 K :实现 BIC,比较 K=1...6K=1\ldots 6K=1...6 在某二维数据集的选择结果。
- MAP--EM:为 GMM 加 NIW 先验,写出 M 步的 MAP 更新式(贴合先验的均值和协方差)。
- 缺失数据 EM:在高斯回归中随机遮盖 20% 特征,写出 E 步下缺失部分的条件期望与协方差。
12. 小结
- EM = E 步求后验期望 + M 步极大化完全数据似然的期望,保证对数似然单调不降。
- GMM 是最经典的例子,软分配 + 加权更新即可;在 σ→0\sigma\to 0σ→0 极限退化为 KMeans。
- 在序列、缺失数据、混合回归、混合因子分析等场景,EM 都是可靠的"通用扳手"。
- 工程要点:多初始化、对数域、正则化协方差、用 BIC/AIC 选 K ,必要时上 MAP-EM / 变分 EM / HMC。
记忆口诀:"看不见就先'想象'(E),想象后去'最大化'(M),循环到像真。"