EM 算法 & GMM 模拟器 返回
机器学习·概率模型

EM 算法 & 高斯混合模型 模拟器

通过 EM (期望最大化) 算法对 GMM (高斯混合模型) 的收敛进行模拟。改变混合成分数 K、样本数、真实重叠度、协方差类型,实时掌握对数似然的收敛曲线、AIC/BIC 模型选择、聚类质量 (ARI)。

参数设置
混合成分数 K
GMM 的高斯成分数量
样本数 N
EM 迭代次数
允许次数的上限。若满足收敛容差则提前停止
真实重叠度
聚类之间的重叠程度 (0=完全分离)
协方差类型
full=任意椭圆,diag=轴平行椭圆,spherical=圆形
收敛容差 (tol)
对数似然的变化量低于此值时判定为收敛
计算结果
估计参数数量
迭代次数 (收敛或上限)
最终对数似然 log L
AIC
BIC
聚类 ARI
GMM 聚类 — 椭圆在每次迭代时更新

2D 散布数据拟合 K 个高斯椭圆的过程。椭圆代表协方差矩阵的主轴(1σ),在 EM 迭代中位置、形状和方向不断更新。颜色表示各成分的所属概率。

对数似然 log L 的收敛过程
模型选择 — AIC / BIC vs K
理论·主要公式

$$Q(\theta|\theta^{old}) = E_{Z|X,\theta^{old}}[\log p(X,Z|\theta)],\quad BIC = -2\log L + k\log N$$

Q 是完全数据对数似然的期望值。E-step 计算后验概率 γ(z),M-step 求最大化 Q 的参数 θ。Q 单调非递减且收敛得到保证。

$$p(x) = \sum_{k=1}^{K} \pi_k\,\mathcal{N}(x|\mu_k,\Sigma_k),\quad \sum_k \pi_k = 1$$

GMM 的概率密度。π_k 是混合比,μ_k 是均值,Σ_k 是协方差矩阵。K-means 是 Σ_k=σ²I 且硬分配的特殊情况。

$$AIC = -2\log L + 2k,\quad \mathrm{ARI} \in [-1, 1]$$

AIC 根据参数数 k 施加惩罚,BIC 根据样本数 N 施加更严格的惩罚。ARI (调整兰德指数) 在值为 1 时表示完全一致,0 表示偶然水平。

EM 算法 — 高斯混合模型 (GMM)

🙋
我只知道 K-means 聚类,「GMM」有什么不同吗?也是找聚类对吧?
🎓
目标相同但观点截然不同。K-means 硬性指定「点 100% 属于某个聚类」。GMM 用概率表达「这个点属于成分 A 的概率是 70%,成分 B 的概率是 30%」,这叫软分配。另外,GMM 把每个聚类建模为「有均值和协方差矩阵的正态分布」,能更好地处理椭圆形或有方向的聚类。从数学角度讲,K-means 其实是 GMM 的特例(协方差为球面,概率四舍五入到 0/1)。
🙋
明白了,GMM 更灵活。但怎样决定「均值和协方差」呢?和 K-means 一样更新重心吗?
🎓
这时就需要 EM (期望最大化) 算法了。分两步反复进行:E-step 用当前参数计算「每个点属于各成分的概率(后验概率 γ)」。M-step 用 γ 作权重,通过最大似然法更新「均值、协方差、混合比」。反复进行直到似然度基本不变。最厉害的是「对数似然单调非递减」在数学上得到保证,所以「不会倒退」。
🙋
不倒退的话,就一定能找到正确答案了吧?
🎓
遗憾的是,这正是 EM 最大的弱点。「单调非递减」不等于「全局最优」。和山坡爬升法一样,可能在低矮的山峰停下,陷入局部最优。试试调高左边的「真实重叠度」。聚类重叠越大,局部最优风险越高,判定变为 WARN。对策很常见:用 K-means++ 给好初值,或「用多个初始值并行运行,选最高似然的结果」(多起点法)。实务中这已成为标准技巧。
🙋
混合成分数 K 怎样决定呢?K-means 有肘部法…
🎓
对 GMM 来说,标准做法是用 AIC 或 BIC 来选。看下面「AIC/BIC vs K」图表。K 太小时数据拟合不足似然度低,K 太大时参数多导致惩罚项增大。中间有个 U 字谷底就是最优 K。BIC 比 AIC 对大的 K 惩罚更重,偏好简单模型。还有,从 full 改到 diag、spherical 限制协方差,参数数会减少,数据量少时 spherical 的 BIC 可能更优。
🙋
EM 和 GMM 在实际中怎样用呢?
🎓
用处太多了。图像分割用 GMM 对像素颜色聚类分离区域,语音识别的 HMM-GMM 是经典(虽然现在有深度学习了),异常检测通过 GMM 拟合正常数据,低概率点判为异常,生物学的单细胞分析用 GMM 识别细胞类型,金融用多峰 GMM 建模收益分布的厚尾……概率模型+EM 是机器学习最基础、最强大的工具之一。

常见问题

EM (期望最大化) 是用于隐变量概率模型的最大似然估计方法。Dempster, Laird, Rubin 于 1977 年统一定式化。E-step 在当前参数下计算隐变量的后验概率(在 GMM 中是每个点属于各高斯成分的概率),M-step 使用这些后验概率作为权重,通过最大似然法更新参数(均值、方差、混合比)。交替进行 E 和 M 步骤时,对数似然单调非递减并收敛,这是 EM 的最大优势。
K 通常选择使 AIC 或 BIC 最小化的值。AIC = -2·logL + 2k,BIC = -2·logL + k·log(N),其中 k 是参数数量,N 是样本数。BIC 对较大的 K 值施加更强的惩罚,偏向更稀疏的模型。本工具的「AIC/BIC vs K」图表显示,当 K 太小时无法充分建模数据导致似然度低,K 太大时参数过多导致惩罚项增大,最优点出现在中间。实际应用中还应结合交叉验证和领域知识约束。
EM 的最大缺点是对初始值的依赖。使用随机初始值启动时,可能会陷入对数似然较差的局部最优。标准对策是使用 K-means++ 初始化,首先用 K-means 找到粗略的聚类中心,将其结果用作 GMM 的初始均值。此外,「使用多个初始值并行运行,最后选择对数似然最高的结果」(多起点法)也被广泛使用。本工具中当「真实重叠度」提高时,局部最优风险上升,判定变为 WARN。
K-means 可视为 GMM 的特殊情况。GMM 用任意协方差矩阵表示各聚类为高斯分布,点以「概率」表示属于哪个聚类(软分配)。K-means 将协方差固定为球面(单位矩阵的倍数),用 0/1 硬分配点到最近邻聚类。GMM 更能表达椭圆形或有方向的聚类,具有概率解释,但参数数量增加,计算成本也更高。在本工具的「协方差类型」中切换 full / diag / spherical 可以看到参数数量的差异。

实际应用

图像处理·计算机视觉:经典图像分割通过对每个像素的颜色 (RGB 向量) 进行 GMM 聚类,分离天空、草地、道路、人物等区域。背景差分(监控摄像头动体检测)使用「对每个像素的色彩历史进行 GMM 建模,新色彩低概率时判为动体」的方法(MOG:混合高斯模型),这在 OpenCV 中已有实现,多年来都是标准方案。

语音识别·说话人识别:深度学习出现前,语音识别主要用 HMM-GMM 组合。每个音素对应 HMM 的各状态,每个状态有对应的 GMM 参数。输入语音通过 Viterbi 搜索找到似然度最高的音素序列。现在虽然 DNN-HMM 系统占主流,但说话人识别(判断声音属于哪个人)仍广泛使用 i-vector、x-vector 配合 GMM-UBM (通用背景模型)。

异常检测·质量控制:用正常状态的传感器数据拟合 GMM,新数据似然度低于阈值时判为异常,这在工厂电机监测、网络入侵检测、医疗数据异常检出等领域都有应用。与 one-class SVM 和隔离森林并列,是「无监督异常检测」的基本工具。

生物·医疗·金融:单细胞 RNA-seq 用 GMM 对各细胞基因表达向量聚类以识别细胞类型。fMRI 分析、流式细胞仪自动门控也常用 GMM。金融领域中,单个高斯无法表达收益率分布的厚尾特性,改用多高斯混合来建模尾部风险。

常见误解与注意事项

最常见的误解是「EM 收敛到全局最优」。EM 保证的只有「对数似然单调非递减」,不是全局最优。特别是聚类重叠或 K 偏大时,根据初始值会收敛到截然不同的解。实务中必须结合多起点法或 K-means++ 那样的智能初始化。本工具也设计成「真实重叠度」升高时局部最优风险上升。

其次是「K 越大越好」的误区。确实 K 越大对数据的拟合越好(对数似然越高),但这是过学习。极端情况下令 K=N 就能用单个高斯覆盖每个点,似然度最大化,对新数据却完全无用。AIC、BIC 和交叉验证通过「对复杂度施加惩罚」来防止过学习。应该遵循「BIC 下降就增大 K」而不是「似然上升就增大 K」的原则。

最后是「协方差矩阵奇异化的实现陷阱。EM 的 M-step 更新各成分协方差,若某成分只包含一个点则协方差变为零矩阵(奇异),该点的密度趋于无穷大,对数似然爆炸,计算崩溃。解决方案有:(1) 协方差加小正则项 (Σ + εI),(2) 删除稀疏成分减少 K,(3) 限制协方差为 diag 或 spherical。scikit-learn 的 GaussianMixture 用 reg_covar 参数自动处理。

使用指南

  1. 在 2~8 范围内设置混合成分数 K,从 100~5000 范围选择样本数 n
  2. 设置迭代次数上限(通常 50~500 次),调整真实重叠度从 0.1(明确分离)到 0.9(高度重叠)
  3. 点击「运行」按钮,EM 算法追踪对数似然收敛,实时显示估计参数数、AIC、BIC、聚类 ARI
  4. 从「球面」「对角」「完全」中选择协方差类型,观察模型复杂度和收敛速度的变化

具体计算示例

K=3 成分、n=1000 样本、重叠度 0.5 的情况:估计参数数为 3×(2+1+1)=12 个。150 次迭代后对数似然收敛到 -2450,AIC=4924、BIC=5012。用同一数据比较 K=2 和 K=4,BIC 在 K=3 处达到最小值,聚类 ARI 达到 0.92,与真实标签高度一致。球面协方差将计算速度提高约 50%。

实务中的注意点

  1. BIC 选择成分数在 n>500 时稳定,但 n<100 时容易过学习,必须和 AIC 并用
  2. 重叠度 0.8 以上时,初始化方法(k-means++)的敏感性上升,建议做 3~5 次不同初值的对比
  3. 完全协方差模型在 K>4 时数值不稳定明显,尤其 n<500 时建议改为对角协方差
  4. 对数似然不单调非递减是迭代数不足的信号(上限 +100),或初始值陷入局部最优