em模型补缺失值_猴子也能理解的EM算法

56ef37a50d63440bfe7b3724e46ca4fc.png

这个例子来自Do, Chuong B, and Serafim Batzoglou; 2008; What Is the Expectation Maximization Algorithm? Nature Biotechnology 26(8): 897–899.

EM算法是ML中一种非常重要的参数估计方法, 在很多地方都用应用. 上述论文给出了一种EM算法的非常直观而又不失精要的理解方式.

抛硬币游戏

假设这样一个抛硬币的测试, 我们有两个硬币A和B, 它们正面朝上的概率分别为

, 我们重复以下操作五次:
  • 从AB中随机抽一个硬币
  • 抛该硬币10次并记录结果

接着我们需要从这个实验中得到对

的估计.

极大似然估计

44672b7039f849ef2a43e91d4ee896a1.png


假设我们的试验结果如上图, 那么我们很容易用极大似然估计来预测:

具体来说, 我们不妨假设, 实验的五次操作中, 每次操作正面朝上的次数为

, 那么有变量
.

同时, 令
为每次操作时选择硬币的类别(A or B), 则有
, 那么极大似然估计就是列出这些参数的联合概率分布
,并求其最大化的参数
.

其实二项式分布+极大似然估计然后就看得到这个公式:

如果到这里结束那也就没有EM什么事了, 现在来给这个游戏加点难度. 现在假设我们不知道每次操作的时候我们抛的到底是硬币A还是B, 也就是说, 变量

变得不可观测了(hidden variable). 此时我们常称
隐变量(hidden variable / latent factor). 这种情况在参数估计中叫做不完全数据. 此时我们就无法直接用极大似然估计来估算概率了, 为此就有了EM算法.

EM算法

如上所述, 我们的问题变成了不完全数据下的参数估计, 那么一个简单的想法就是将这种不完全数据给补全了, 那我们的问题不就可以归结到完全数据的参数估计了嘛.

于是, 一种很简单的迭代式的想法就是:

  1. 先初始化参数
  2. 对测试中每次操作, 基于现有的参数猜想它是由A还是B抛出的.
  3. 根据上一步的猜想, 我们将不完全的数据补全了, 此时就可以用极大似然估计来更新参数
    .
  4. 重复前两步步骤直到收敛.

其实到这里, EM算法的大概思路就已经出来了. 第三步中的问题其实就是上一节所介绍的, 那么重点就在于第二步中我们如何猜想. 实际上EM算法基于现有的参数

来对缺失数据(隐变量)的每种可能都计算出概率值, 然后用这种概率对所有可能的补全数据加权. 最后我们的极大似然就基于这种调整了权重的训练样本.

下面我们举个例子说明一下:

ae0b802b8b68fbf47f67975751d2a351.png

在上图中, 我们按步骤标号来解释:

  1. 初始化参数
    ,
    .
  2. E-step, 我们对缺失的数据进行补全. 例如对于第一次操作,
    的概率为0.45, 而
    的概率为0.55. 其他四次实验样本也是类似的操作, 然后我们就得到右边这样一个调整了权重的训练样本.
  3. M-step, 基于上面的数据用极大似然估计来更新参数.
  4. 重复上述两步若干次到收敛后, 输出结果.

在上面的步骤中E-step得名于Expectation(期望), 其实也就是我们通常没必要显示计算出数据补全的概率分布, 而只需要计算期望的显著统计量. 而M-step得名于Maximization, 也就是这一步会去最大化期望的对数似然.

令人生畏的数学基础

对大部分人来说, 上面的部分就已经足够了, 但是对好奇心过剩的人们来说, 不妨看看下面简单的数学分析.

我们先回到最初的设定, 即用极大似然解决的完全数据问题, 此时我们的目标函数

有一个全局最优点, 也就是说该问题通常有一个解析解.

与之相反的是, 在不完全数据的情况下, 目标函数

有多个局部最优而没有闭式解.

为了解决这个问题, EM算法的做法将这个困难的优化问题化解为一系列更简单的子问题, 具体而言, 这些子问题都有一个全局最优且有闭式解, 而这些依次解决的子问题的解

保证会收敛于原问题的一个局部最优.

在E-step中, 算法选择了一个函数

作为目标函数
的下界, 也就是
. 而在M-step中, 算法就针对最大化
函数选择了一个新的参数
. 因为我们的下界函数
对应了参数为
时的目标函数, 我们也就有

那么我们的目标函数也就能在迭代中不断下降直到收敛于局部最优. 为了避免局部最优, 我们通常会以不同的初始点多次进行EM算法来打破模型的对称性, 并选择其中最优的结果.

5759fe94625a22a7a8fc3a49db9b0a0d.png


上图给出了EM算法的一个直观图示, 蓝线是真实的目标函数, 一条条绿线则是不断逼近局部最优的下界函数.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EM算法(Expectation Maximization Algorithm)是一种常用的缺失值处理方法,它可以通过观察已知数据的分布情况,来估计缺失值,从而实现数据的插。 具体步骤如下: 1. 初始化所有缺失值为一个合理的值。 2. E步骤:计算每个缺失值的条件概率分布。 3. M步骤:使用条件概率分布计算每个缺失值的最大似然估计值。 4. 重复执行E步骤和M步骤,直到收敛。 下面是一个使用EM算法进行缺失值的Python示例代码: ```python import numpy as np # 初始化数据 data = np.array([[1, 2, np.nan], [3, np.nan, 4], [5, 6, 7]]) # 初始化缺失值 missing_mask = np.isnan(data) data[missing_mask] = -1 # 迭代次数 max_iter = 100 for i in range(max_iter): # E步骤:计算每个缺失值的条件概率分布 mu = np.nanmean(data, axis=0) sigma = np.nanvar(data, axis=0) p = np.exp(-(data - mu) ** 2 / (2 * sigma)) / np.sqrt(2 * np.pi * sigma) p[missing_mask] = 1 # M步骤:使用条件概率分布计算每个缺失值的最大似然估计值 data[missing_mask] = np.sum(p * data, axis=0) / np.sum(p, axis=0) # 输出结果 print(data) ``` 在这个例子中,我们使用了numpy库的isnan、nanmean和nanvar函数,来处理缺失值。在E步骤中,我们使用了高斯分布计算每个缺失值的条件概率分布;在M步骤中,我们使用了最大似然估计来计算每个缺失值的值。最后,我们迭代了100次,并输出了插后的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值