【机器学习】高斯分布 高斯混合模型

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算法的核心是一个迭代的过程,它通过两个步骤的交替进行来逼近最优解:

  1. E步(期望步) :基于当前对模型参数的猜测,来"补全"缺失的信息。具体来说,就是计算每个数据点属于各个高斯分布的可能性(即后验概率)
  2. 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(视为已知),重新估计模型参数:

  1. 更新混合系数(权重)π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

  2. 更新均值 μ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

  3. 更新协方差 Σ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)=arg⁡max⁡k π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步(更新参数)
对"异常值"的容忍度 敏感(离群点会拉动质心) 较鲁棒(离群点属于任何簇的概率都很低,贡献被削弱)
相关推荐
咖啡星人k2 小时前
2026 MCP 模型上下文协议:让 AI 自己动手接工具,告别手写接口(MonkeyCode 实战)
人工智能·深度学习·机器学习·语言模型·自然语言处理
专注仿真3 小时前
Spring AI 实现智能对话系统项目指南
数据结构·spring·机器学习
今天会营业4 小时前
Miniconda安装
python·机器学习
啥都想学点的研究生5 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
aichitang20247 小时前
希尔伯特空间中的正交性
人工智能·学习·机器学习·ai·泛函分析
轮到我狗叫了7 小时前
Slurm如何使用
人工智能·python·深度学习·机器学习
段一凡-华北理工大学9 小时前
高炉炉况智能诊断与预警实战~系列文章18:预警提前量问题:过程滞后与预测窗口的权衡
服务器·网络·人工智能·机器学习·高炉智能化·炉况预警·工业预警滞后
摆烂老大9 小时前
论文学习 | HESS2025 | 中亚寒区季节水文预报
学习·机器学习·水文
MartinYeung510 小时前
[论文分析]使大型语言模型智能体与理性和道德偏好对齐:一种监督微调方法
人工智能·机器学习·语言模型