期望最大化算法(EM,Expectation-Maximization) 是一种经典的用于参数估计的迭代优化算法,广泛应用于统计学、机器学习和数据挖掘等领域。其最初由 Arthur Dempster 、Nan Laird 和 Donald Rubin 在1977年提出,并在之后的几十年里成为了处理具有隐变量(latent variables)模型中参数估计问题的重要工具。
- 问题场景 {#title-0} ==================
在 EM 算法中,隐藏变量通常是指在模型中无法直接观测到的信息,它直接影响了对模型参数估计。假设:随机抛掷两枚硬币 1 和硬币 2,正面朝上概率分别为 P1、P2,求解 P1、P2 的值?
- 为了求解到 P1 的概率,我们必须知道硬币 1 一共抛掷了多少次, 并且有多少次正面朝上?
- 为了求解到 P2 的概率,我们必须知道硬币 2 一共抛掷了多少次,并且有多少次正面朝上?
这些我们需要的信息从上表观测数据中都可以获得,所以可以很轻松计算出 P1、P2 的值。那么,如果观测数据缺失某些信息的话,如下表所示(每次抛的是哪枚硬币我们不知道):
在这种场景下,我们如何估计 P1、P2 的值?
- 如果不知道每次抛的是什么硬币,无法估计 P1、P2 的值
- 如果知道 P1、P2 的值,可以估计每次抛的最有可能是那个硬币
即:想知道 B,需要知道 A,反过来,想知道 A,又必须知道 B。这就是由于缺失信息导致的相互依赖的两个问题,无法解决。
- 解决思路 {#title-1} ==================
EM 算法通过最大化数据的对数似然 函数来寻找参数的最优解,由两步组成,称为期望步骤(E步)和最大化步骤(M步):
- E步(Expectation Step):基于当前参数估计值,计算隐藏变量的期望。也就是说,计算在当前参数估计下观察到的数据属于不同类别的概率(即 "软分配")。
- M步(Maximization Step):使用 E 步中计算的期望,最大化对数似然函数,更新参数值。这个步骤旨在找到使得似然值最大的参数估计。
EM 重复执行 E 步和 M 步,直至收敛:
- 似然函数的收敛:EM算法每次迭代会使得似然函数的值逐步增加,一个常见的收敛条件是似然函数的值在两次迭代间的变化小于某个预设的阈值;
- 参数的收敛:参数的变化小于某个阈值也是常用的收敛条件之一,即当两次迭代间模型参数 θ 的变化量小于给定的阈值时,算法认为已经收敛;
- 最大迭代次数:为了防止算法陷入无穷循环或局部最优,通常会设定一个最大迭代次数,当达到最大迭代次数时即停止。
EM算法虽然没有保证一定能收敛到全局最优解,但在满足以上条件之一时一般会停止。
上面问题使用 EM 算法解决的步骤如下:
- 我们先假设:p1 = 0.2、p2 = 0.7,当然这个假设并不一定准确
- 计算:
- 假设:使用硬币 1 抛掷的话,计算当前观测序列出现的最大概率
- 假设:使用硬币 2 抛掷的话,计算当前观测序列出现的最大概率
- 取最大概率的硬币作为当前观测序列最有可能使用的硬币
- 对每一个观测序列使用步骤 2 的思想,即可得到最有可能的硬币序列,假设为:(硬币1,硬币2,硬币1,硬币1,硬币2)
- 知道了硬币的观察序列,更新计算 p1、p2 的值
- 根据新的 p1、p2 值再去判断最优可能的硬币抛掷序列,进而再次去更新 p1、p2 值. 迭代 2-4 步.
补充:
-
每次估计出的 p1、p2 理论上是更加接近于真实值,整个算法也会收敛到最优的值。
-
EM 算法简单、能够找到最优值,但由于对初始值敏感,不保证收敛到全局最优点。
-
计算过程 {#title-2} ==================
首先进行参数的初始化:
3.1 第一次迭代 {#title-3}
计算可能的抛掷序列:
如果序列比较长,连续概率相乘可能会导致数值溢出。所以,一般会替换为对数概率计算,即:连乘转换为连加的计算。得到了硬币的序列,更新 p1、p2 值:
- 硬币 1 一共抛掷了 15 次,其中有 5 次正面朝上,则:p1 = 5/15
- 硬币 2 一共抛掷了 10 次,其中有 6 次正面朝上,则:p2 = 6/10
3.2 第二次迭代 {#title-4}
计算计算可能抛掷的序列:
更新 p1、p2 值:
- 硬币 1 一共抛掷了 10 次,其中 4 次正面朝上,则:p1 = 4/10=0.4
- 硬币2 一共抛掷了 15 次,其中 7 次正面朝上,则:p2 = 7/15=0.47
此时, 我们发现 p1、p2 越来越接近真实的 0.5 了。当满足某个收敛条件停止迭代,此时得到参数估计值。