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

EM 算法的概念-宏观概览

image
image
image
image
image

EM算法的实例讲解

要彻底搞懂 EM 算法,就必须看一个“不完美”的例子。

1. 场景设定:某班级的数学考试成绩

假设一个班级严重两极分化,只有两类学生:

  • 学渣帮(模型 A)
  • 学霸帮(模型 B)
  • 人数比例

现在,老师手里拿着一张 88分 的试卷(样本 x=88),想要判断这张卷子的情况,该怎么处理呢?这就要用到今天的主角——EM算法。

由于上面只有2个人班级的例子太极端了(非黑即白)。真实世界里,最难处理的是“中间派”

这次我们把班级扩充到 5个人,而且特意加入一个让模型纠结的“65分”同学。我们将一步步手动演算 EM 算法的 第一轮迭代


1. 场景设置:5人微型班级

数据样本 (x)

  1. 同学 A:40分(明显的学渣)
  2. 同学 B:50分(明显的学渣)
  3. 同学 C65分关键人物:可能是考好的学渣,也可能是考砸的学霸)
  4. 同学 D:85分(明显的学霸)
  5. 同学 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分)”的身份:

  1. 带入学渣模型 (\mu=45, \sigma=10)
  • 距离:|65 - 45| = 20
  • 指数项:e{-\frac{202}{2 \times 100}} = e^{-2} \approx 0.135
  • 加权可能性:0.5 \times 0.135 = \mathbf
  1. 带入学霸模型 (\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
  1. 归一化 (计算 \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.215.5
  • 变化:你会发现,两个距离变得接近了!这意味着下一轮计算时,C 同学是学霸的概率会下降(不再是 82% 那么笃定,可能降到 60% 左右)。
  • 结果:参数会继续微调,直到达到完美的平衡。

这就是 EM 算法的本质:在“分数据”和“定标准”之间反复横跳,直到找到最合理的解释。

posted @ 2025-12-18 09:51  AlphaGeek  阅读(255)  评论(0)    收藏  举报