📑 本页目录(点开跳转)
13 · EM 与高斯混合:有隐变量时怎么学
⏱ 28 分钟 | ⭐ K-Means 的真身
🎯 一句话
有些东西你想学,但关键信息看不见(比如"这个点属于哪一类")。 EM 算法:先猜看不见的,再用猜的去更新参数,反复迭代。 而 K-Means 就是它的一个特例。
🥚 一、鸡生蛋问题
想做聚类:
├─ 如果知道每个点属于哪一簇 → 就能算出每簇的中心 ✅
└─ 如果知道每簇的中心 → 就能判断每个点属于哪簇 ✅
但两个都不知道 💀 ← 这就是【隐变量】问题
EM 的解法简单粗暴:
随便初始化 → 循环{
E 步 (Expectation):假装参数是对的,猜出隐变量
M 步 (Maximization):假装隐变量是对的,更新参数
} 直到不变
💡 人话:两个未知量,先固定一个求另一个,来回倒腾直到都不动了。
💡 这个"交替优化"的思想在机器学习里到处都是: 推荐算法的 ALS(交替最小二乘)、GAN 的对抗训练、坐标下降…… 只要目标函数对某一组变量单独优化容易,就可以试试交替。
🎯 二、高斯混合模型(GMM)
假设:数据由 K 个高斯分布混合生成。
$$p(x) = \sum_{k=1}^{K}\pi_k\,\mathcal{N}(x\mid\mu_k,\Sigma_k)$$
| 参数 | 含义 | 个数 |
|---|---|---|
| $\pi_k$ | 第 k 个成分的权重(占比),$\sum\pi_k=1$ | K−1 |
| $\mu_k$ | 第 k 个成分的中心 | K·d |
| $\Sigma_k$ | 第 k 个成分的形状(协方差) | K·d(d+1)/2 |
生成过程的直觉:
① 先按概率 π 抛一个"骰子"决定用哪个高斯
② 再从那个高斯里抽一个点
→ 你只看到了点,没看到骰子结果 ← 那就是【隐变量】z
EM 求解 GMM
📐 两步的公式(想看再点)
E 步:算「责任」——点 $x_i$ 有多大程度属于成分 k
$$\gamma_{ik} = \frac{\pi_k\,\mathcal{N}(x_i\mid\mu_k,\Sigma_k)}{\sum_j \pi_j\,\mathcal{N}(x_i\mid\mu_j,\Sigma_j)}$$
(这就是贝叶斯定理:后验 = 先验 × 似然 / 归一化,见第 2 章)
M 步:用责任加权重新估计参数
$$N_k = \sum_i\gamma_{ik},\quad \mu_k = \frac{1}{N_k}\sum_i \gamma_{ik}x_i,\quad \pi_k = \frac{N_k}{n}$$
$$\Sigma_k = \frac{1}{N_k}\sum_i\gamma_{ik}(x_i-\mu_k)(x_i-\mu_k)^\top$$
💡 注意 M 步的形式:就是普通的均值/协方差公式,只是每个样本带了个权重 γ。
💡 人话:
E 步:每个点按"像谁"的程度,把自己的一票按比例分给各个簇(软分配)。 M 步:每个簇按收到的选票加权,重算自己的中心和形状。
⭐ 三、K-Means 是 GMM 的特例
在 GMM 里做三个限制:
① 所有 Σₖ = σ²I (球形,且大小相同)
② σ² → 0 (方差趋于零)
③ 所有 πₖ 相等
→ E 步的软分配 γ 退化成【硬分配】(0 或 1)
→ M 步就变成"取平均"
→ 得到 K-Means ⭐
📐 为什么 σ²→0 会让软分配变硬(想看再点)
责任的表达式里,高斯密度 $\propto \exp(-\|x-\mu_k\|^2/2\sigma^2)$。
$\sigma^2 \to 0$ 时,指数上的负数被放大到极端: 离得最近的那个 μ 的指数项相对其他项趋于无穷大, softmax 后变成 one-hot —— 也就是硬分配。
(这和基础教程第 15 章 里 softmax 温度趋于 0 的效果是同一回事。)
对比表
| K-Means | GMM | |
|---|---|---|
| 分配方式 | 硬(属于/不属于) | 软(70% 属于 A,30% 属于 B)⭐ |
| 簇的形状 | 只能球形,大小相同 | 任意椭圆,各簇形状可不同 ⭐ |
| 输出 | 标签 | 概率 + 完整的密度模型 |
| 速度 | 快 | 慢(要算协方差) |
| 参数量 | K·d | K·(d + d²/2 + 1) |
| 高维表现 | 尚可 | ❌ 协方差参数爆炸,容易奇异 |
🔗 基础教程第 6 章说 「K-Means 只能找球形簇」——根因在这: 它隐含假设了所有成分都是同样大小的球形高斯。 GMM 放开这个假设就能找椭圆簇。
💡 软分配的实用价值
硬分配丢掉的信息:
一个点 51% 像 A、49% 像 B 和 一个点 99% 像 A
→ K-Means 眼里【一模一样】,都标成 A
软分配保留了它:
→ 可以识别"边界模糊"的样本
→ 可以做基于概率的异常检测(所有簇的概率都低 = 异常)
→ 可以给下游模型提供更丰富的特征
📈 四、EM 的理论保证
每次迭代,对数似然单调不减。
$$\log L(\theta^{(t+1)}) \ge \log L(\theta^{(t)})$$
✅ 保证收敛(不会震荡,不会变差)
❌ 但只保证收敛到【局部最优】
📐 为什么单调不减(想看再点)
EM 的本质是优化一个下界:
$$\log p(X|\theta) \ge \underbrace{\mathbb{E}_{q(z)}[\log p(X,z|\theta)] + H(q)}_{\text{ELBO,证据下界}}$$
- E 步:固定 θ,选 $q(z) = p(z|X,\theta)$ → 让下界【等于】对数似然(贴紧)
- M 步:固定 q,最大化下界 → 下界上升,所以对数似然至少不降
对数似然 ▔▔▔▔╱▔▔▔▔
╱ ↑M步:抬高下界
下界 ╱____↑E步:把下界顶到贴着似然
💡 这就是"变分推断"的雏形——VAE 里的 ELBO 就是这个。
实践含义:
| 问题 | 解法 |
|---|---|
| 局部最优 | 多次随机初始化,取似然最高的(sklearn 的 n_init)⭐ |
| 初始化敏感 | 用 K-Means++ 初始化,或先跑 K-Means 再初始化 GMM |
| 协方差退化(某簇塌成一个点,似然趋于 ∞) | 加正则:reg_covar,给协方差加个小对角项 ⭐ |
| K 怎么选 | BIC / AIC(GMM 有似然,所以能用信息准则)⭐ |
| 高维时协方差参数太多 | 用 covariance_type="diag" 或 "spherical" 限制形状 |
⚠️ 协方差退化是 GMM 特有的坑: 如果某个成分只包含一个点,它的协方差会趋于 0,似然趋于无穷—— 这是一个真实的数学奇点,不是数值误差。 必须加
reg_covar。
🔨 用 BIC 客观选 K
from sklearn.mixture import GaussianMixture
import numpy as np
bics = []
for k in range(1, 11):
gm = GaussianMixture(k, n_init=5, reg_covar=1e-4, random_state=0).fit(X)
bics.append(gm.bic(X))
best_k = int(np.argmin(bics)) + 1
print(f"BIC 最小的 K = {best_k}")
💡 GMM 相比 K-Means 的一个实用优势:因为它是概率模型, 可以用 BIC 客观地选 K,而 K-Means 只能靠肘部法则那种主观判断。
🌍 五、EM 的其他用武之地
EM 不只是聚类,凡是有"看不见的变量"的地方它都能用:
| 应用 | 隐变量是什么 |
|---|---|
| 缺失值填补 | 缺掉的那些值 |
| HMM(语音、序列标注) | 隐藏状态序列 |
| 主题模型(LDA) | 每个词属于哪个主题 |
| 半监督学习 | 未标注样本的标签 |
| 矩阵分解的概率版 | 隐因子 |
| 混合专家(MoE) | 该路由到哪个专家 ⭐ |
🔗 两个漂亮的连接: 1. 变分自编码器(VAE)里的"变分推断",本质上是 EM 在无法精确计算 E 步时的近似版本——现代生成模型的一条根在这。 2. MoE 架构(现代大模型常用)的训练,思想上和 EM 同源—— 「决定用哪个专家」就是隐变量。
🔗 六、和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 基础教程第 6 章 K-Means | GMM 的特例(硬分配 + 球形等大) |
| K-Means 只能找球形簇 | 根因:隐含的高斯假设 |
| K-Means 要多次初始化 | EM 只保证局部最优 |
| 第 1 章最大似然 | EM 就是在最大化似然,只是有隐变量 |
| 第 2 章贝叶斯定理 | E 步算的责任就是后验概率 |
| 《数据这一关》05 的缺失值填充 | 那一章说「填充 = 在给定所有已知信息(含 y)下从后验抽样」——这里就是它的正式框架:缺掉的值当隐变量 |
| 推荐算法的矩阵分解 | 概率版 MF 可以用 EM 求解 |
| 全景导论的 MoE 架构 | 隐变量思想的现代应用 |
✅ 检查点
- EM 解决什么类型的问题?两步各干什么?
- 「交替优化」这个思想还出现在哪些地方?
- GMM 的 E 步算的"责任"是什么意思?它和贝叶斯定理什么关系?
- K-Means 是 GMM 加了哪三个限制?为什么 σ²→0 会让分配变硬?
- 软分配相比硬分配保留了什么信息?有什么实用价值?
- EM 的理论保证是什么?它不保证什么?
- 什么是协方差退化?为什么必须加
reg_covar? - GMM 相比 K-Means 在"选 K"上有什么优势?
👀 答案
- 有隐变量(关键信息看不见)的参数估计。E 步:固定参数猜隐变量;M 步:固定隐变量更新参数。反复迭代。
- ALS(交替最小二乘)、GAN 的对抗训练、坐标下降。只要"对某一组变量单独优化容易"就能试。
- 点 xᵢ 属于成分 k 的概率(软分配权重)。它就是贝叶斯定理的后验:先验 πₖ × 似然 N(x|μₖ,Σₖ) 再归一化。
- ①协方差球形等大 Σₖ=σ²I ②σ²→0 ③权重相等。σ²→0 时高斯密度指数上的负数被放大到极端,离得最近的那个 μ 的项相对其他趋于无穷,softmax 后变成 one-hot。
- 保留了"有多像"的程度。价值:识别边界模糊的样本、基于概率做异常检测(所有簇概率都低=异常)、给下游提供更丰富的特征。
- 保证每次迭代对数似然单调不减(因此收敛)。但只保证局部最优,所以要多次随机初始化。
- 某成分只含极少的点时协方差趋于 0,似然趋于无穷——这是真实的数学奇点不是数值误差。
reg_covar给协方差加小对角项防止塌缩。 - GMM 是概率模型有似然,可以用 BIC/AIC 客观选 K;K-Means 只能用肘部法则等主观判断。
🛑 可以停在这里
⚡ 走神救援
EM 解隐变量问题——鸡生蛋:知道点属于哪簇就能算簇中心,知道中心就能定归属,但两个都不知道。解法:随便初始化,循环 E 步(假装参数对,猜隐变量)→ M 步(假装隐变量对,更新参数) 直到不变。⭐这个"交替优化"到处都是:ALS、GAN、坐标下降。GMM:
p(x) = Σ πₖ N(x|μₖ,Σₖ),你只看到点、没看到"用了哪个高斯",那就是隐变量。E 步算"责任" γ——⭐它就是贝叶斯后验(先验 πₖ × 似然 N 归一化);M 步就是普通均值/协方差公式,只是每个样本带权重 γ。⭐⭐K-Means 是 GMM 的特例:三个限制 Σₖ = σ²I(球形等大)、σ²→0、πₖ 相等;σ²→0 时密度指数上的负数被放大到极端,最近的 μ 相对其他项趋于无穷、softmax 后变 one-hot,软分配退化成硬分配、M 步变取平均。⭐这也是"K-Means 只能找球形簇"的根因,GMM 放开这个假设就能找椭圆簇。软分配保留了"有多像":51% 像 A 和 99% 像 A 的点在 K-Means 眼里一模一样,保留下来就能做概率异常检测(所有簇概率都低=异常)。⭐保证:对数似然每次迭代单调不减(所以一定收敛),本质是E 步把 ELBO 下界顶到贴着似然、M 步抬高下界——这就是变分推断的雏形,VAE 的 ELBO 就是它;⚠️但只到局部最优 → 多次随机初始化取似然最高的(n_init)。⚠️协方差退化:某成分只含极少点时协方差→0、似然→∞,这是真实的数学奇点不是数值误差,必须加reg_covar。⭐优势:它有似然,能用 BIC/AIC 客观选 K,K-Means 只能靠肘部法则。EM 远不止聚类:缺失值填补、HMM、LDA、MoE(隐变量=路由到哪个专家)都是。
下一节 👉 14-实战与挑战项目.md