全网最通俗易懂的【EM算法】的原理详解——附案例实操讲解(笨办法搞懂抽象概念)
EM 算法的概念-宏观概览





EM算法的实例讲解
要彻底搞懂 EM 算法,就必须看一个“不完美”的例子。
1. 场景设定:某班级的数学考试成绩
假设一个班级严重两极分化,只有两类学生:
- 学渣帮(模型 A):
- 学霸帮(模型 B):
- 人数比例:
现在,老师手里拿着一张 88分 的试卷(样本 x=88),想要判断这张卷子的情况,该怎么处理呢?这就要用到今天的主角——EM算法。
由于上面只有2个人班级的例子太极端了(非黑即白)。真实世界里,最难处理的是“中间派”。
这次我们把班级扩充到 5个人,而且特意加入一个让模型纠结的“65分”同学。我们将一步步手动演算 EM 算法的 第一轮迭代。
1. 场景设置:5人微型班级
数据样本 (x):
- 同学 A:40分(明显的学渣)
- 同学 B:50分(明显的学渣)
- 同学 C:65分(关键人物:可能是考好的学渣,也可能是考砸的学霸)
- 同学 D:85分(明显的学霸)
- 同学 E:95分(明显的学霸)
初始猜测 (Initialization):
我们要假装自己一无所知,随便猜一组参数(故意猜得不太准,给算法留出优化空间):
- 学渣帮 (k=1):均值 \mu_1 = 45,标准差 \sigma_1 = 10(方差 100)。
- 学霸帮 (k=2):均值 \mu_2 = 75,标准差 \sigma_2 = 10(方差 100)。
- 人数比例:假设各占一半,\alpha_1 = 0.5, \alpha_2 = 0.5。
2. 第一阶段:E步骤 (Expectation) —— 发放“身份卡”
目标:计算每个人属于“学渣”和“学霸”的概率 \gamma。
核心公式 (来自图2):
我们需要用到高斯概率密度公式(高度):
(为了方便阅读,我们忽略常数系数 \frac{1}{\sqrt{2\pi}},只算相对大小)
详细计算“关键人物 C (65分)”的身份:
- 带入学渣模型 (\mu=45, \sigma=10):
- 距离:|65 - 45| = 20
- 指数项:e{-\frac{202}{2 \times 100}} = e^{-2} \approx 0.135
- 加权可能性:0.5 \times 0.135 = \mathbf
- 带入学霸模型 (\mu=75, \sigma=10):
- 距离:|65 - 75| = 10
- 指数项:e{-\frac{102}{2 \times 100}} = e^{-0.5} \approx 0.606
- 加权可能性:0.5 \times 0.606 = \mathbf
- 归一化 (计算 \gamma):
- 总可能性 = 0.0675 + 0.303 = 0.3705
- 是学渣的概率 (\gamma_{C,1}):0.0675 / 0.3705 \approx \mathbf
- 是学霸的概率 (\gamma_{C,2}):0.303 / 0.3705 \approx \mathbf
解读:虽然 65 分夹在中间,但因为它离 75 更近(差10分),离 45 远(差20分),所以算法判定他 82% 的可能是考砸了的学霸。
全班 E步 计算结果表:
我们将同样的步骤应用到所有人身上,得到下表(这是 M 步的基础):
| 学生 | 分数 (x) | 属于学渣的概率 (\gamma_{j1}) | 属于学霸的概率 (\gamma_{j2}) | 备注 |
|---|---|---|---|---|
| A | 40 | 0.98 | 0.02 | 铁杆学渣 |
| B | 50 | 0.82 | 0.18 | 主要是学渣 |
| C | 65 | 0.18 | 0.82 | 被划归学霸阵营 |
| D | 85 | 0.02 | 0.98 | 铁杆学霸 |
| E | 95 | 0.00 | 1.00 | 铁杆学霸 |
| 合计 | - | N_1 \approx 2.0 | N_2 \approx 3.0 | 有效人数 |
3. 第二阶段:M步骤 (Maximization) —— 更新参数
现在我们不再看原始分数了,我们要看着上面那张“概率表”,重新计算学渣和学霸的标准。
任务 1:更新均值 (\mu) (对应图2底部公式)
公式逻辑:\frac{\text{加权总分}}{\text{总权重}}
-
更新学渣帮均值 (\mu_1'):
我们要把大家的分数乘上大家是学渣的概率。 -
分子计算:39.2 + 41.0 + 11.7 + 1.7 + 0 = 93.6
-
分母计算:2.0
-
结果:93.6 / 2.0 = \mathbf
对比:初始猜的 45,现在修正到了 46.8。因为 65 分的那位同学贡献了 18% 的力量,把平均分拉高了一点。
-
更新学霸帮均值 (\mu_2'):
-
分子计算:0.8 + 9.0 + 53.3 + 83.3 + 95.0 = 241.4
-
分母计算:3.0
-
结果:241.4 / 3.0 = \mathbf
对比:初始猜的 75,现在修正到了 80.5。因为 65 分同学虽然考得低,但 85 和 95 的同学权重很大,把平均分拉回了高位。
任务 2:更新方差 (\Sigma) (对应图3顶部公式)
公式逻辑:\frac{\text{加权距离平方}}{\text{总权重}}
这是在算:这个帮派里的人,发挥稳不稳定?(需使用刚刚更新的均值 \mu')
- 更新学渣帮方差 (\Sigma_1'):
新均值是 46.8。我们要看每个人离 46.8 有多远,权重是“他是学渣的概率”。 - A (40分): 0.98 \times (40 - 46.8)^2 = 0.98 \times 46.24 \approx 45.3
- B (50分): 0.82 \times (50 - 46.8)^2 = 0.82 \times 10.24 \approx 8.4
- C (65分): 0.18 \times (65 - 46.8)^2 = 0.18 \times 331.24 \approx 59.6 (虽然他概率低,但离得远,贡献了很大方差)
- D, E: 权重太小,忽略。
- 计算:(45.3 + 8.4 + 59.6) / 2.0 \approx \mathbf
对比:初始猜的 100,现在变小到了 56.6(标准差约 7.5)。说明学渣帮比我们要想的更“扎堆”。
任务 3:更新权重 (\alpha) (对应图3中间公式)
公式逻辑:\frac{\text{该帮派的总有效人数}}{\text{全班总人数}}
- 更新学渣帮比例 (\alpha_1'):2.0 / 5 = \mathbf
- 更新学霸帮比例 (\alpha_2'):3.0 / 5 = \mathbf
解读:算法发现,全班 5 个人里,大概有 3 个人(60%)倾向于学霸帮(包括那个 65 分的),只有 2 个人倾向于学渣帮。所以调整了市场份额。
4. 最终对比:迭代前 vs 迭代后
只经过了这一轮(E+M),我们的参数发生了显著变化:
| 参数 | 初始瞎猜 (Before) | 第一轮修正后 (After) | 真实趋势 |
|---|---|---|---|
| 学渣均分 | 45 | 46.8 | 逼近真实的小分队 (40,50) |
| 学霸均分 | 75 | 80.5 | 逼近真实的大分队 (65,85,95) |
| 学渣方差 | 100 | 56.6 | 发现数据其实很集中 |
| 学霸权重 | 50% | 60% | 发现学霸人数更多 |
5. 接下来会发生什么?
这只是一轮。
接下来,我们会拿着 新的参数(均分 46.8 / 80.5) 回到 E步。
关键预测:
对于 65分 的同学 C:
- 上一轮:均分是 45 和 75。65 距离两者分别为 20 和 10。
- 这一轮:均分是 46.8 和 80.5。65 距离两者分别为 18.2 和 15.5。
- 变化:你会发现,两个距离变得接近了!这意味着下一轮计算时,C 同学是学霸的概率会下降(不再是 82% 那么笃定,可能降到 60% 左右)。
- 结果:参数会继续微调,直到达到完美的平衡。
这就是 EM 算法的本质:在“分数据”和“定标准”之间反复横跳,直到找到最合理的解释。

浙公网安备 33010602011771号