1. 高斯分布(Gaussian Distribution)
高斯分布,也就是我们熟悉的正态分布 ,它描述了一个最常见的自然规律:大多数数据会集中在一个平均值附近,偏离越远的数据出现的可能性越小。它的概率密度函数图像是一条对称的钟形曲线 。
N(x∣μ,Σ)=1(2π)d/2∣Σ∣1/2exp(−12(x−μ)TΣ−1(x−μ)) N(x | \mu, \Sigma) = \frac{1}{(2\pi)^{d/2} |\Sigma|^{1/2}} \exp\left( -\frac{1}{2}(x - \mu)^T \Sigma^{-1} (x - \mu) \right) N(x∣μ,Σ)=(2π)d/2∣Σ∣1/21exp(−21(x−μ)TΣ−1(x−μ))
这个分布由两个关键参数决定:
- 均值(μ):决定了曲线的中心位置,也就是数据平均值的所在。
- 方差(σ²):决定了曲线的形状,方差越大,曲线越"胖",数据越分散;方差越小,曲线越"瘦高",数据越集中。
在现实世界中,人的身高、考试成绩、测量误差等大量现象都近似服从高斯分布。
2. 高斯混合模型(Gaussian Mixture Model, GMM)
现实中的数据往往很复杂,单一的高斯分布无法很好地描述。比如,当我们统计一群人的身高时,由于男女身高各有自己的均值,整体数据会呈现出两个"钟形"叠加的形态。
高斯混合模型(GMM)正是为了解决这个问题而生的。它就是用多个高斯分布的加权组合来拟合复杂的数据分布。
对于 d维 的数据,其概率密度函数为:
p(x)=∑k=1Kπk⋅N(x∣μk,Σk) p(x) = \sum_{k=1}^{K} \pi_k \cdot N(x | \mu_k, \Sigma_k) p(x)=k=1∑Kπk⋅N(x∣μk,Σk)
- KKK:混合模型中高斯分量的个数。
- πk\pi_kπk:第 kkk 个分量的混合系数 (即权重),相当于在生成数据时,随机选择这个分量的概率。它必须满足 ∑k=1Kπk=1\sum_{k=1}^{K} \pi_k = 1∑k=1Kπk=1 且 0≤πk≤10 \le \pi_k \le 10≤πk≤1。
- N(x∣μk,Σk)N(x | \mu_k, \Sigma_k)N(x∣μk,Σk) :第 kkk 个高斯分量的概率密度函数,拥有自己独立的均值 μk\mu_kμk 和协方差 Σk\Sigma_kΣk。
因为可以组合多个高斯分布,GMM非常灵活,能平滑地近似任意形状的密度分布,因此在聚类、语音识别、图像分割等领域应用广泛。
3. EM算法(Expectation-Maximization Algorithm)
现在的问题来了:当我们使用GMM时,我们手头只有一堆数据点,却不知道这些数据点分别属于哪个高斯分布,也不知道每个分布的参数(均值、方差)和权重。这就好比一道菜已经做好了,但我们既不知道菜谱(模型参数),也不知道每种调料放了多少。EM算法就是用来在这样"信息不全"的情况下,反向推断出模型参数的"秘密武器"。
EM算法的核心是一个迭代的过程,它通过两个步骤的交替进行来逼近最优解:
- E步(期望步) :基于当前对模型参数的猜测,来"补全"缺失的信息。具体来说,就是计算每个数据点属于各个高斯分布的可能性(即后验概率)。
- M步(最大化步) :利用E步补全的信息(每个点属于谁的可能性),重新估计模型参数(即更新各个高斯分布的均值、方差和权重),使得整个模型拟合数据的能力达到最大。
这个过程会不断重复,直到模型参数不再发生明显变化(即收敛)。一个经典的比喻是:把一锅菜不均匀地分到两个碗里,不断从多的碗里舀一点到少的碗里,直到两个碗看起来一样多。
好的,我们来看这三个概念的数学公式。这部分需要一点线性代数基础,我会尽量用文字解释清楚每个符号的含义。
E步(期望步)
计算每个数据点 xix_ixi 来自第 kkk 个高斯分量的后验概率 (即"责任"),记作 γik\gamma_{ik}γik:
γik=πk⋅N(xi∣μk,Σk)∑j=1Kπj⋅N(xi∣μj,Σj) \gamma_{ik} = \frac{\pi_k \cdot N(x_i | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \cdot N(x_i | \mu_j, \Sigma_j)} γik=∑j=1Kπj⋅N(xi∣μj,Σj)πk⋅N(xi∣μk,Σk)
公式解读 :分子是"第k个分量自己生成xix_ixi的可能性",分母是所有K个分量生成xix_ixi的总可能性。两者的比值就是"这个点到底有多大程度上属于第k类"。
M步(最大化步)
利用E步算出的 γik\gamma_{ik}γik(视为已知),重新估计模型参数:
-
更新混合系数(权重)πk\pi_kπk (所有点的"责任"平均值):
πknew=1N∑i=1Nγik \pi_k^{\text{new}} = \frac{1}{N} \sum_{i=1}^{N} \gamma_{ik} πknew=N1i=1∑Nγik
-
更新均值 μk\mu_kμk (用"责任"对数据点做加权平均):
μknew=∑i=1Nγik⋅xi∑i=1Nγik \mu_k^{\text{new}} = \frac{\sum_{i=1}^{N} \gamma_{ik} \cdot x_i}{\sum_{i=1}^{N} \gamma_{ik}} μknew=∑i=1Nγik∑i=1Nγik⋅xi
-
更新协方差 Σk\Sigma_kΣk (用"责任"对偏离程度做加权平均):
Σknew=∑i=1Nγik⋅(xi−μknew)(xi−μknew)T∑i=1Nγik \Sigma_k^{\text{new}} = \frac{\sum_{i=1}^{N} \gamma_{ik} \cdot (x_i - \mu_k^{\text{new}})(x_i - \mu_k^{\text{new}})^T}{\sum_{i=1}^{N} \gamma_{ik}} Σknew=∑i=1Nγik∑i=1Nγik⋅(xi−μknew)(xi−μknew)T
在EM算法收敛之后,对于任意一个数据点 xix_{i}xi,你只需要计算它属于每个高斯分量的后验概率 ,然后取使 γik\gamma_{ik}γik 最大 的那个 kkk 作为聚类标签
label(xi)=argmaxk πk⋅N(xi∣μk,Σk)∑j=1Kπj⋅N(xi∣μj,Σj) \boxed{\text{label}(x_i) = \arg\max_{k} \ \frac{\pi_k \cdot N(x_i | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \cdot N(x_i | \mu_j, \Sigma_j)}} label(xi)=argkmax ∑j=1Kπj⋅N(xi∣μj,Σj)πk⋅N(xi∣μk,Σk)
4 与 K-Means 算法对比
| 对比维度 | K-Means 聚类 | GMM 聚类(基于EM) |
|---|---|---|
| 归属方式 | 硬分类(非A即B) | 软分类(70%是A,30%是B) |
| 簇的形状 | 只能是圆形(各向同性) | 可以是任意方向的椭圆(各向异性) |
| 权衡依据 | 欧几里得距离(点到质心) | 马氏距离(考虑协方差) + 先验概率权重 |
| 迭代步骤 | 分配点到最近质心 → 更新质心 | E步 (算概率) → M步(更新参数) |
| 对"异常值"的容忍度 | 敏感(离群点会拉动质心) | 较鲁棒(离群点属于任何簇的概率都很低,贡献被削弱) |