🏠 总目录📚 本教程 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,证据下界}}$$

   对数似然 ▔▔▔▔╱▔▔▔▔
             ╱  ↑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 架构 隐变量思想的现代应用

✅ 检查点

  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 只能用肘部法则等主观判断。

🛑 可以停在这里

走神救援

EM 解隐变量问题——鸡生蛋:知道点属于哪簇就能算簇中心,知道中心就能定归属,但两个都不知道。解法:随便初始化,循环 E 步(假装参数对,猜隐变量)→ M 步(假装隐变量对,更新参数) 直到不变。⭐这个"交替优化"到处都是:ALS、GAN、坐标下降。GMMp(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

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