【机器学习】嘿马机器学习(算法篇)第6篇:EM算法,3.3 EM算法实例【附代码文档】

77 阅读1分钟

教程全知识点简介:1.定位、目标。2. K-近邻算法涵盖距离度量、k值选择、kd树、鸢尾花种类预测数据集介绍、练一练、交叉验证网格搜索、facebook签到位置预测案例。3. 线性回归包括线性回归简介、线性回归损失和优化、梯度下降法介绍、波士顿房价预测案例、欠拟合和过拟合、正则化线性模型、正规方程推导方式、梯度下降法算法比较优化、维灾难。4. 逻辑回归涵盖逻辑回归介绍、癌症分类预测案例(良恶性乳腺癌肿瘤预测、获取数据)、ROC曲线绘制。5. 朴素贝叶斯算法包括朴素贝叶斯算法简介、概率基础复习、商品评论情感分析案例(取出内容列数据分析、判定评判标准好评差评)。6. 支持向量机涵盖SVM算法原理、SVM损失函数、数字识别器案例。7. 决策树算法包括决策树分类原理、cart剪枝、特征工程特征提取、决策树算法api、泰坦尼克号乘客生存预测案例。8. EM算法涵盖初识EM算法、EM算法介绍。9. HMM模型包括马尔科夫链、HMM简介、前向后向算法评估观察序列概率、维特比算法解码隐藏状态序列、HMM模型API介绍。10. 集成学习进阶涵盖Bagging、xgboost算法原理、otto案例(Otto Group Product Classification Challenge xgboost实现)、数据变化可视化、lightGBM、stacking算法基本思想、住房月租金预测。11. 聚类算法包括聚类算法api初步使用、聚类算法实现流程、模型评估、算法优化、特征降维、用户对物品类别喜好细分案例、算法选择指导。12. 数学基础涵盖向量与矩阵范数、朗格朗日乘子法、Huber Loss、极大似然函数取对数原因。

👉👉👉   gitee.com/yinuo112/AI…

EM算法


学习目标

  • 了解什么是EM算法
  • 知道极大似然估计
  • 知道EM算法实现流程

3.3 EM算法实例

学习目标

  • 通过实例了解EM算法实现的流程

1 一个超级简单的案例

假设现在有两枚硬币1和2,,随机抛掷后正面朝上概率分别为P1,P2。为了估计这两个概率,做实验,每次取一枚硬币,连掷5下,记录下结果,如下:

硬币结果统计
1正正反正反3正-2反
2反反正正反2正-3反
1正反反反反1正-4反
2正反反正正3正-2反
1反正正反反2正-3反

可以很容易地估计出P1和P2,如下:

P1 = (3+1+2)/ 15 = 0.4 P2= (2+3)/10 = 0.5

到这里,一切似乎很美好,下面我们加大难度。

2 加入隐变量z后的求解

还是上面的问题,现在我们抹去每轮投掷时使用的硬币标记,如下:

硬币结果统计
Unknown正正反正反3正-2反
Unknown反反正正反2正-3反
Unknown正反反反反1正-4反
Unknown正反反正正3正-2反
Unknown反正正反反2正-3反

好了,现在我们的目标没变,还是估计P1和P2,要怎么做呢?

显然,此时我们多了一个隐变量z,可以把它认为是一个5维的向量(z1,z2,z3,z4,z5),代表每次投掷时所使用的硬币,比如z1,就代表第一轮投掷时使用的硬币是1还是2。但是,这个变量z不知道,就无法去估计P1和P2,所以,我们必须先估计出z,然后才能进一步估计P1和P2。

但要估计zzz

答案就是先随机初始化一个P1和P2,用它来估计z,然后基于z,还是按照最大似然概率法则去估计新的P1和P2,如果新的P1和P2和我们初始化的P1和P2一样,请问这说明了什么?(此处思考1分钟)

这说明我们初始化的P1和P2是一个相当靠谱的估计!

就是说,我们初始化的P1和P2,按照最大似然概率就可以估计出z,然后基于z,按照最大似然概率可以反过来估计出P1和P2,当与我们初始化的P1和P2一样时,说明是P1和P2很有可能就是真实的值。这里面包含了两个交互的最大似然估计。

如果新估计出来的P1和P2和我们初始化的值差别很大,怎么办呢?就是继续用新的P1和P2迭代,直至收敛。

这就是下面的EM初级版。

2.1 EM初级版

我们不妨这样,先随便给P1和P2赋一个值,比如:

  • P1 = 0.2
  • P2 = 0.7

然后,我们看看第一轮抛掷最可能是哪个硬币。

  • 如果是硬币1,得出3正2反的概率为0.2∗0.2∗0.2∗0.8∗0.8=0.005120.20.20.20.80.8 = 0.005120.2∗0.2∗0.2∗0.8∗0.8=0.00512
  • 如果是硬币2,得出3正2反的概率为0.7∗0.7∗0.7∗0.3∗0.3=0.030870.70.70.70.30.3=0.030870.7∗0.7∗0.7∗0.3∗0.3=0.03087

然后依次求出其他4轮中的相应概率。做成表格如下:

轮数若是硬币1若是硬币2
10.005120.03087
20.020480.01323
30.081920.00567
40.005120.03087
50.020480.01323

按照最大似然法则:

  • 第1轮中最有可能的是硬币2
  • 第2轮中最有可能的是硬币1
  • 第3轮中最有可能的是硬币1
  • 第4轮中最有可能的是硬币2
  • 第5轮中最有可能的是硬币1

我们就把上面的值作为z的估计值。然后按照最大似然概率法则来估计新的P1和P2。

  • P1 = (2+1+2)/15 = 0.33
  • P2=(3+3)/10 = 0.6

设想我们是全知的神,知道每轮抛掷时的硬币就是如本文第001部分标示的那样,那么,P1和P2的最大似然估计就是0.4和0.5(下文中将这两个值称为P1和P2的真实值)。那么对比下我们初始化的P1和P2和新估计出的P1和P2:

初始化的P1估计出的P1真实的P1
0.20.330.4
初始化的P2估计出的P2真实的P2
0.70.60.5

看到没?我们估计的P1和P2相比于它们的初始值,更接近它们的真实值了!

可以期待,我们继续按照上面的思路,用估计出的P1和P2再来估计z,再用z来估计新的P1和P2,反复迭代下去,就可以最终得到P1 = 0.4,P2=0.5,此时无论怎样迭代,P1和P2的值都会保持0.4和0.5不变,于是乎,我们就找到了P1和P2的最大似然估计。

这里有两个问题:

  • 1、新估计出的P1和P2一定会更接近真实的P1和P2?

    • 答案是:没错,一定会更接近真实的P1和P2,数学可以证明,但这超出了本文的主题,请参阅其他书籍或文章。
  • 2、迭代一定会收敛到真实的P1和P2吗?

    • 答案是:不一定,取决于P1和P2的初始化值,上面我们之所以能收敛到P1和P2,是因为我们幸运地找到了好的初始化值。

2.2 EM进阶版

下面,我们思考下,上面的方法还有没有改进的余地?

我们是用最大似然概率法则估计出的z值,然后再用z值按照最大似然概率法则估计新的P1和P2。也就是说,我们使用了一个最可能的z值,而不是所有可能的z值。

如果考虑所有可能的z值,对每一个z值都估计出一个新的P1和P2,将每一个z值概率大小作为权重,将所有新的P1和P2分别加权相加,这样的P1和P2应该会更好一些。

所有的z值有多少个呢?

  • 显然,有25=322^5=322​5​​=32

不需要,我们可以用期望来简化运算。

轮数若是硬币1若是硬币2
10.005120.03087
20.020480.01323
30.081920.00567
40.005120.03087
50.020480.01323

利用上面这个表,我们可以算出每轮抛掷中使用硬币1或者使用硬币2的概率。

比如第1轮,使用硬币1的概率是:

  • 0.00512/(0.00512+0.03087)=0.140.00512/(0.00512+0.03087)=0.140.00512/(0.00512+0.03087)=0.14

使用硬币2的概率是1-0.14=0.86

依次可以算出其他4轮的概率,如下:

轮数zi=z_i=z​i​​=zi=z_i=z​i​​=
10.140.86
20.610.39
30.940.06
40.140.86
50.610.39

上表中的右两列表示期望值。看第一行,0.86表示,从期望的角度看,**这轮抛掷使用硬币2的概率是0.86。相比于前面的方法,我们按照最大似然概率,直接将第1轮估计为用的硬币2,此时的我们更加谨慎,我们只说,有0.14的概率是硬币1,有0.86的概率是硬币2,不再是非此即彼。**这样我们在估计P1或者P2时,就可以用上全部的数据,而不是部分的数据,显然这样会更好一些。

这一步,我们实际上是估计出了z的概率分布,这步被称作E步。

结合下表:

硬币结果统计
Unknown正正反正反3正-2反
Unknown反反正正