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

EM算法(1维GMM)模拟器

通过EM法逐次估计2成分高斯混合模型,可视化E步骤和M步骤的反复过程。每次迭代混合分布逐渐拟合观测直方图,同时对数似然单调增加的过程一目了然。

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

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

暂停时,拖动滑块即可即时更新结果。

计算结果
迭代次数 t
估计 μ₁(真值 0.0)
估计 μ₂(真值 4.0)
对数似然 LL
直方图、混合密度和 LL 推移

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

理论、主要公式

2成分高斯混合模型 $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下降,说明计算公式有缺陷。

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

🙋
"EM算法"经常听到,但到底是在做什么呢?看着图表只能看到两个山峰…
🎓
简单来说,"EM算法"就是"推断观测数据背后隐藏的混合结构的迭代计算"。上面的直方图是200个数据点,实际上这些数据是从"中心为0,标准差为1"和"中心为4,标准差为1.5"这两个高斯分布生成的。但只看观测数据的话,"哪个点来自哪个分布"是无法判断的。EM就是用来推断这个的。试试把滑块上的"EM迭代次数"从0改到30。你会看到蓝色实线(估计分布)逐渐与灰色直方图重合。
🙋
E步骤和M步骤有什么区别呢?用其中一个不行吗?
🎓
E步骤是"在当前参数下计算每个数据点来自哪个成分的概率"。这个概率叫做"责任度"。M步骤是用这些责任度作为权重,通过最大似然估计来更新每个成分的μ、σ²和混合比π。"给数据加权(E)"和"用加权平均进行更新(M)"要交替进行。看下面的LL图,EM每次迭代对数似然都会增加。这是有数学保证的。
🙋
那改变"μ₁初始值"的话,结果也会变?
🎓
对,这正是实际工作中容易踩坑的地方。EM只能保证收敛到对数似然的局部最大值。如果μ₁初始值设为1.0,μ₂初始值设为3.0,会顺利收敛到真值(0和4)。但如果两个都设在2.0附近,就分离不好,或者其中一个飞远了。实际做法是"用10几个随机初始值各运行一次EM,取对数似然最大的那个"。或者先用K-means粗略初始化,再切换到EM。
🙋
提到了K-means,它和EM的关系是什么?
🎓
K-means其实是GMM/EM的特殊情况。如果在GMM中让所有成分共享方差,然后取σ→0的极限,那么责任度就变成"离最近中心的地方为1,其他地方为0"。这就是K-means的"硬分配"。EM是"软分配(概率按比例分)",K-means是"硬分配(一刀切)"。记住这一点就容易理解了。实际上,先用K-means初始化,再改用EM的两阶段方法也很常见。

常见问题

混合数 K 事先通常不知道,需要用信息量准则来决定。最代表的是 BIC(贝叶斯信息量准则)= −2·LL + k·log(N),其中 k 是参数数,N 是样本数。BIC 是对数似然(拟合好度)减去模型复杂度的惩罚,选择使 BIC 最小的 K。AIC 的惩罚较宽松容易过拟合,BIC 更严格倾向于选择节约的模型。针对数据尝试 K=1, 2, 3, ... 比较 BIC 是实际的方法。
标准做法是用多个随机初始值(例如10~20次)运行EM,采用最终对数似然最大的解的"多启动EM"。或者先用K-means粗略聚类再传给EM的两阶段法也广为应用。本工具中试试把μ₁和μ₂的初始值设得离真值很远,就能看到陷入局部解的现象。
当聚类是球形、大小相同、边界清晰时,K-means 就够用了。当聚类形状是椭圆、大小不同、相互重叠时,GMM/EM 更合适。GMM 能给出每个点的概率(责任度),在边界附近的点可以"两可"处理,这是优势。实务中通常先用K-means掌握情况,必要时再进一步用GMM。
"对数似然 LL 的增量 |LL[t]−LL[t−1]| 低于预定阈值(例 1e−4 或 1e−6)时停止"是标准做法。同时设置最大迭代次数(例100~1000)作为上限。本模拟器默认值(30次迭代)对本数据集已足够收敛。LL 的单调增加中断的话说明实现有bug,应优先检查数值稳定化(ε 的加算等)。

现实中的应用

客户分组和营销: 当购买金额、来店频率等分布是多个群体的重叠时,用GMM/EM推断"优质客户层""普通层""流失预警层"等隐藏群体,针对性施策。比K-means能更灵活处理椭圆形聚类。

异常检测: 将正常数据拟合到GMM,新数据的对数似然特别低就判断为异常。传感器时间序列、网络流量、金融交易等领域广泛使用。是简单却强大的古典手法。

语音和图像处理: 语音识别的音响模型长期使用GMM-HMM(虽然现在被深度学习部分取代,轻量级模型仍在用)。图像的前景/背景分离中,将像素颜色分布建模为GMM,推断每个像素的前景/背景(如GrabCut)。

缺失数据的最大似然估计: EM 不只适用于GMM,对所有包含未观测潜在变量的概率模型的最大似然估计都适用。把缺失值视为"潜在变量",缺失数据的ML推断也可直接用EM框架实现。HMM、因子分析、PLSA、LDA等多数统计模型的推断算法都以EM为基础。

常见误解和注意点

最常见的误解是以为EM会返回全局最优解。EM 的理论保证仅限于"对数似然每次迭代单调增加""收敛到局部最大值(或鞍点)",不保证全局最优。本模拟器中试试把μ₁初始值设为−2,μ₂初始值设为7,会掉进另一个局部解,估计精度下降。实务中必须用多启动EM试多个初始值,采用最大LL的那个。

次常见的误解是觉得混合数K越多越好,拟合就越好。确实K增加对数似然单调增加,但这是典型的过拟合。对训练数据拟合好,但对未知数据的泛化能力反而恶化。要用BIC、AIC、交叉验证等选择K,平衡解释能力。"仅凭LL决定K"是禁忌。

最后要注意的是疏于数值稳定化会破坏EM。责任度γ的分母接近0、方差压扁到0、对数里数值接近0这些都会发生。本工具在高斯pdf加了方差下限(1e−6),对数似然加了微小值(1e−12),责任度分子分母也加了ε。实装时要统一ε的加算位置,每次反复都必须确认"LL是否单调增加",这是最高效的debug方法。

使用指南

  1. 初始值设置:用滑块指定μ₁和μ₂的初始值。真值是μ₁=0.0、μ₂=4.0,但可故意从不同值出发,观察算法的收敛过程。
  2. 随机数种子设置:设定数据生成的种子,多次实验用同一数据集时确保重现性。
  3. 迭代次数设置:用滑块指定E步骤和M步骤的执行次数,即可就地重新运行EM算法,每步的参数更新和对数似然的变化实时显示(无需运行按钮,改变输入会自动更新)。

具体计算例

数据集:真实混合 N(0, 1.0²) 占40%、N(4, 1.5²) 占60%,共 N=200 个样本(固定种子42)。从初始值 μ₁=1.0、μ₂=3.0、π₁=0.5、σ₁=σ₂=1.5 出发。10 次迭代时估计 μ₁≈0.24、μ₂≈3.98、π₁≈0.41,对数似然从初始 −459.9 改善到约 −431.1。30 次迭代时估计 μ₁≈0.07、μ₂≈3.80、π₁≈0.36,对数似然 ≈ −430.5 稳定(在该有限样本下 μ₂ 略小于真值 4.0)。

实务中的注意