EM算法(一维GMM)模拟器 返回
统计学模拟器

EM算法(一维GMM)模拟器

用 EM 算法对二分量一维高斯混合模型进行迭代估计。可观察 E 步和 M 步反复进行时,混合密度逐步贴合观测直方图、对数似然单调增加的全过程。

参数设置
μ₁ 初始值
μ₂ 初始值
EM 迭代次数
数据随机种子

固定: σ₁=σ₂=1.5、π₁=π₂=0.5(初始值)。真值: μ=(0, 4), σ=(1.0, 1.5), π=(0.4, 0.6), N=200。

计算结果
估计 μ₁(真值 0.0)
估计 μ₂(真值 4.0)
估计 π₁(真值 0.40)
最终对数似然 LL
直方图、混合密度与 LL 轨迹

上: 直方图(灰)/ 真实混合密度(黑虚线)/ 估计混合密度(蓝实线)/ 分量1(绿虚线)/ 分量2(红虚线)。下: 每次迭代的对数似然 LL[t](红线,单调不减)。

理论与主要公式

对二分量高斯混合模型 $p(x)=\pi_1\mathcal{N}(x|\mu_1,\sigma_1^2)+\pi_2\mathcal{N}(x|\mu_2,\sigma_2^2)$,通过反复进行 E 步与 M 步的 EM 算法进行估计。

E 步(责任度 $\gamma_{ik}$ 是数据 $x_i$ 由分量 $k$ 生成的后验概率):

$$\gamma_{ik}=\frac{\pi_k\,\mathcal{N}(x_i|\mu_k,\sigma_k^2)}{\sum_j \pi_j\,\mathcal{N}(x_i|\mu_j,\sigma_j^2)}$$

M 步(用责任度作为权重更新 $\mu_k, \sigma_k^2, \pi_k$):

$$N_k=\sum_i \gamma_{ik},\quad \mu_k\leftarrow\frac{1}{N_k}\sum_i \gamma_{ik}\,x_i,\quad \sigma_k^2\leftarrow\frac{1}{N_k}\sum_i \gamma_{ik}(x_i-\mu_k)^2,\quad \pi_k\leftarrow\frac{N_k}{N}$$

对数似然(EM 每次迭代保证单调不减):

$$\mathrm{LL}=\sum_i \log\!\left(\sum_k \pi_k\,\mathcal{N}(x_i|\mu_k,\sigma_k^2)\right)$$

LL 的单调增加可作为实现正确性的检查指标。若两次迭代之间 LL 出现下降,说明更新公式存在 bug。

EM算法(一维GMM)模拟器是什么

🙋
「EM 算法」经常听人提到,但它到底在做什么?图上只看到两个鼓包啊…
🎓
大致来说,EM 是「从观测数据中反向推断潜在混合结构」的迭代算法。上面的直方图是 200 个样本,其实来自「中心 0、标准差 1」和「中心 4、标准差 1.5」两个高斯分布。但只看观测数据,你无法知道哪个点属于哪个分量,EM 就是来估这件事的。把「EM 迭代次数」从 0 滑到 30,可以看到蓝色实线(估计分布)逐步贴合灰色直方图。
🙋
E 步和 M 步有什么区别?只跑其中一个不行吗?
🎓
E 步在当前参数下,计算「每个点来自每个分量的概率」,这个量叫「responsibility(责任度)」。M 步以这个责任度为权重,用加权极大似然更新每个分量的 μ、σ²、混合权重 π。「给数据加权(E)」和「按加权平均更新(M)」交替进行。看下面的 LL 图,EM 每次迭代都会让对数似然单调不减,这是有数学证明的。
🙋
那「μ₁ 初始值」改了结果也会变吗?
🎓
会,而且这是实际工作中最容易踩的坑。EM 只能保证局部最大。用 μ₁=1.0、μ₂=3.0 起步,会顺利收敛到真值 0 和 4;但若两个初始值都设在 2.0 附近,算法可能分不开两个分量,甚至把一个均值甩到很远。实务里通常做「多次随机重启 EM」,从多个初始值跑一遍,保留对数似然最大的那一组;或先用 K-means 粗聚类作为初始值。
🙋
你提到 K-means,它和 EM 是什么关系?
🎓
K-means 其实是 GMM 上 EM 的特例。如果让所有分量共享方差并取 σ→0 的极限,责任度就会变成「最近中心为 1、其它为 0」的硬分配,正是 K-means 的形式。EM 给「软分配」(按概率切分),K-means 给「硬分配」(一刀切)。在重叠区域,EM 不会一下子丢掉信息,这是它的优势。

常见问题

K 通常事先不知道,标准做法是用贝叶斯信息准则 BIC = −2·LL + k·log(N)(k 是自由参数数,N 是样本量)。分别尝试 K = 1, 2, 3, ... 并选择使 BIC 最小的 K。AIC 罚则较轻偏向过拟合,BIC 罚则较重偏向简约模型,实务中两者经常对比。若需要可解释性,也可以根据领域知识直接固定 K。
标准做法是「多次重启 EM」:用 10~20 个随机初始值反复运行 EM,保留最终对数似然最大的解;或者用 K-means 的聚类结果初始化 EM 的均值与权重。在本工具中,把 μ₁ 与 μ₂ 初始值设得远离真值,可以观察到算法陷入局部解的现象。
当各聚类近似球形、大小相近、分离明显时,K-means 已经足够。若聚类形状是椭圆、大小不一或有重叠,则更适合 GMM/EM。GMM 还能输出每个点的概率(责任度),方便处理边界附近的点。实务推荐做法是先用 K-means 看一眼数据,必要时再切到 GMM 做细化。
标准规则是「当对数似然增量 |LL[t]−LL[t−1]| 小于预设阈值(1e−4 或 1e−6)时停止」,并设置最大迭代次数(如 100~1000 次)作为上限。本模拟器默认 30 次,对该数据集已足够收敛。若 LL 出现下降,必然是实现 bug——先检查数值稳定化(适当位置加 ε)。

实际应用

客户分群与营销: 当购买金额、来访频次等指标由多个潜在客户群叠加而成时,用 GMM/EM 可以分出「高价值」「普通」「流失风险」等潜在群体,配合差异化营销策略。相比 K-means,GMM 能更灵活地处理椭圆形聚类。

异常检测: 在正常数据上拟合 GMM,新数据点的对数似然若异常低,则判定为异常。这是制造产线传感器时序、网络流量、金融交易等场景中经典但强大的方法。

语音与图像处理: 语音识别的声学模型长期采用 GMM-HMM(近年来被深度学习取代为主,但轻量场景仍在用)。图像前景/背景分离中,用 GMM 对像素颜色建模并推断每个像素的归属(如 GrabCut)也是经典手法。

缺失数据的极大似然估计: EM 不限于 GMM,可用于任何含潜在变量的概率模型的极大似然估计。把缺失值视为潜在变量,含缺失的数据也能在同一 EM 框架下做 ML 估计。许多其它算法(HMM、因子分析、PLSA、LDA)也都建立在 EM 之上。

常见误解与注意事项

最常见的误解是「EM 会返回全局最优解」。EM 的理论保证仅是「对数似然每次迭代单调不减」和「收敛到局部最大或鞍点」,不保证全局最优。本工具中将 μ₁ 初始值设到 −2、μ₂ 设到 7 这样远离真值,能看到算法落入不同的局部解、估计精度变差。实务中务必使用多次重启 EM 并保留 LL 最大的解。

其次常见的错误是「K 越大模型越好」。K 越大训练对数似然必然越高,但这正是过拟合的典型表现:训练集拟合改善而对新数据泛化变差。应使用 BIC、AIC 或交叉验证选 K,并在拟合优劣与可解释性之间权衡。原则是「不能仅凭训练 LL 决定 K」。

最后要小心数值不稳定。责任度分母可能趋近 0、方差可能塌缩到 0、对数的参数可能为 0。本工具在高斯 pdf 中对方差设下界(1e−6)、对数似然里加微小量(1e−12)、责任度分子分母同时加 ε。自己实现 EM 时,请把 ε 的加入位置统一好,并在每次迭代检查「LL 是否单调不减」——这一条检查能尽早发现绝大多数 bug。