🏠 总目录📚 本教程 13 · EM 与高斯混合 ← →
📑 本页目录(点开跳转)

13 · EM 与高斯混合:有隐变量时怎么学

⏱ 28 分钟 | ⭐ K-Means 的真身


🎯 一句话

有些东西你想学,但关键信息看不见(比如"这个点属于哪一类")。 EM 算法:先猜看不见的,再用猜的去更新参数,反复迭代。 而 K-Means 就是它的一个特例。

E 步:固定中心,猜归属颜色深浅 = 属于哪一簇的把握M 步:固定归属,挪中心每个中心移到自己那群点的重心EM两个都不知道,就轮流固定一个求另一个鸡生蛋:知道归属能算中心,知道中心能定归属⭐ 保证似然【单调不减】,所以一定收敛 —— 但只到局部最优所以要多次随机初始化取最好的那次。K-Means 就是它把软分配换成硬分配的特例
鸡生蛋问题:知道归属能算中心,知道中心能定归属,但两个都不知道 —— 那就轮流固定一个求另一个。⭐ 保证似然单调不减所以一定收敛,但只到局部最优,要多次随机初始化。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 步构造在当前参数处贴住似然的下界,M 步提高该下界;虚线始终不高于实线。曲线为关系示意。目标值参数对数似然旧下界蓝虚线:更新后的下界
横轴是参数,纵轴向上表示目标值更大。E 步构造在当前参数处贴住似然的下界,M 步提高该下界;虚线始终不高于实线。曲线为关系示意。

图下说明

  • 对数似然
  • ↑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
from sklearn.datasets import make_blobs
import numpy as np

# ⭐ 先造一份「真实 K = 3」的数据,才看得出 BIC 有没有把它挑回来
X, _ = make_blobs(n_samples=600, centers=3, cluster_std=0.8, random_state=0)

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("各 K 的 BIC:", [round(b) for b in bics])
print(f"BIC 最小的 K = {best_k}")

# ⚠️ 只把团调散一点(cluster_std 0.8 → 1.0),同一个种子就会给出 K = 2
X2, _ = make_blobs(n_samples=600, centers=3, cluster_std=1.0, random_state=0)
b2 = [GaussianMixture(k, n_init=5, reg_covar=1e-4, random_state=0).fit(X2).bic(X2)
      for k in range(1, 11)]
print(f"团更散一点时,BIC 选的是 K = {int(np.argmin(b2)) + 1}")

实跑输出:各 K 的 BIC 是 [4542, 4182, 4139, 4171, 4204, ...], 最小值落在 K = 3;而把团调散之后,BIC 选的是 K = 2。

💡 GMM 相比 K-Means 的一个实用优势:因为它是概率模型, 可以用 BIC 客观地选 K,而 K-Means 只能靠肘部法则那种主观判断。

⚠️ 但「客观」不等于「一定选对」:上面第二次实验里真实是 3 团,BIC 给的是 2。 ⭐ 这不是 BIC 坏了 —— 两团重叠到一定程度时,用一个成分去盖住它们, 省下的参数惩罚比拟合上的损失更划算,此时「K 到底是几」在数据里本来就不再唯一。 所以 BIC 给的是「在这份数据上最划算的 K」,不是「生成它的那个 K」。


🌍 五、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 架构 隐变量思想的现代应用

✅ 检查点

  1. EM 解决什么类型的问题?两步各干什么?
  2. 「交替优化」这个思想还出现在哪些地方?
  3. GMM 的 E 步算的"责任"是什么意思?它和贝叶斯定理什么关系?
  4. K-Means 是 GMM 加了哪三个限制?为什么 σ²→0 会让分配变硬?
  5. 软分配相比硬分配保留了什么信息?有什么实用价值?
  6. EM 的理论保证是什么?它不保证什么?
  7. 什么是协方差退化?为什么必须加 reg_covar?
  8. GMM 相比 K-Means 在"选 K"上有什么优势?
👀 答案
  1. 有隐变量(关键信息看不见)的参数估计。E 步:固定参数猜隐变量;M 步:固定隐变量更新参数。反复迭代。
  2. ALS(交替最小二乘)、GAN 的对抗训练、坐标下降。只要"对某一组变量单独优化容易"就能试。
  3. 点 xᵢ 属于成分 k 的概率(软分配权重)。它就是贝叶斯定理的后验:先验 πₖ × 似然 N(x|μₖ,Σₖ) 再归一化。
  4. ①协方差球形等大 Σₖ=σ²I ②σ²→0 ③权重相等。σ²→0 时高斯密度指数上的负数被放大到极端,离得最近的那个 μ 的项相对其他趋于无穷,softmax 后变成 one-hot。
  5. 保留了"有多像"的程度。价值:识别边界模糊的样本、基于概率做异常检测(所有簇概率都低=异常)、给下游提供更丰富的特征。
  6. 保证每次迭代对数似然单调不减(因此收敛)。但只保证局部最优,所以要多次随机初始化。
  7. 某成分只含极少的点时协方差趋于 0,似然趋于无穷——这是真实的数学奇点不是数值误差。reg_covar 给协方差加小对角项防止塌缩。
  8. GMM 是概率模型有似然,可以用 BIC/AIC 客观选 K;K-Means 只能用肘部法则等主观判断。

🛑 可以停在这里

⚡ 走神救援

先记住这几件事

下一节 👉 14-实战与挑战项目.md

打卡记录保存在你的浏览器里,首页能看到总进度