5.3.3 EM算法简单实例

根据表2的情况可知,只要知道Z,就能求出参数\theta=(p_1,p_2)。但要知道Z,又必须通过参数\theta推导出来,否则无法推出z的具体情况。为此,我们可以把Z看成一个隐变量,这样完整的数据就是(X,Z),通过极大似然估计对参数\theta=(p_1,p_2)进行估计,因存在隐变量z,一般无法直接用解析式表达参数,故采用迭代的方法进行优化,具体步骤如下:
输出:模型参数\theta
EM算法具体步骤
(1)先初始化参数\theta_0=(p_1^0,p_2^0)
(2)假设第t次循环时参数为\theta_t,求Q函数
Q(\theta,\theta_t)=\sum_{i=1}^m\sum_{z_i} p(z_i|x_i,\theta_t )logp(x_i,z_i|\theta)
(3)对Q函数中的参数\theta实现极大似然估计,得到\theta_{t+1}
\theta_{t+1}= \underset{\theta}{argmax} Q(\theta,\theta_t)
(4)重复第(2)和(3)步,直到收敛或指定循环步数。
其中第(2)步需要求\p(z_i|x_i,\theta_t ),我们定义为:
根据这个迭代步骤,第1次迭代过程如下:
(1)初始化参数\theta_0=(p_1^0,p_2^0)
(2)E步,计算Q函数
先计算隐含变量的后验概率:p(z_i|x_i,\theta_t )

按同样方法,完成剩下4轮投掷,最后得到投掷统计信息如下表所示:
\mu_i=p(z_i|x_i,\theta_t )的实现过程可用二项分布的实现,具体过程如下:

计算Q函数,设y_i表示第i轮投掷出现正面的次数。
(3)对Q函数中的参数\theta实现极大似然估计,得到\theta_1
\theta_{1}= \underset{\theta}{argmax} Q(\theta,\theta_0)
对Q函数求导,并令导数为0。
所以\theta_1=(0.35,0.53)
进行第2轮迭代:
基于第1轮获取的参数\theta_1=(0.35,0.53),进行第2轮EM计算:
计算每个实验中选择的硬币是1和2的概率,计算Q函数(E步),然后在计算M步,得\theta_2=(0.40,0.48)
继续迭代,直到收敛到指定阈值或循环次数。

以上计算过程可用Python实现

具体代入如下:
把硬币1用A表示,硬币1用B表示。H(或1)表示正面朝上,T(或0)表示反面朝上。
1、导入需要的库

2、把观察数据写成矩阵

3、单步EM算法,迭代一次算法实现步骤

4、执行

[0.35, 0.53]
与手工计算的结果一致。
5、EM算法主循环
EM算法的主循环,给定循环的两个终止条件:模型参数变化小于阈值;循环达到最大次数。

6、测试

运行结果
[[0.35, 0.53], 1]

运行结果
[0.4, 0.48], 2]

运行结果
[[0.44, 0.44], 5]

练习

用python实现以下这个简单实例: