EM算法:

最大期望算法是一类通过迭代进行极大似然估计的优化算法,通常作为牛顿迭代法的替代,用于对包含隐变量或缺失数据的概率模型进行参数估计。

在进行了解之前,我们先通过一个抛硬币的经典例子来解释EM算法的由来:
现在我们有两枚硬币 A 和 B,这两枚硬币和普通的硬币不一样,他们投掷出正面的概率和投掷出反面的概率不一定相同。

我们将 A 和 B 投掷出正面的概率分别记为θA和θB。独立地做 5 次试验:

随机的从这两枚硬币中抽取 1 枚,投掷 10 次,统计出现正面的次数,如下图:

EMD示例python代码 python emd算法_参数估计

在实验中,记录两组随机变量:
X = (X1 , X2 , X3 , X4 , X5 )
Z = (Z1 , Z2 , Z3 , Z4 , Z5 )
其中 Xi ∈ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } 代表试验 i 中出现正面的次数,
Zi∈{ A, B } 代表这次 试验投掷的是硬币 A 还是硬币 B。
目标是通过这个实验来估计θ= (θA ,θB) 的数值。
这个实 验中的参数估计是有完整数据的参数估计,因为我们不仅知道每次试验中投掷出正面的次数,还知道每次试验中投掷的是硬币 A还是B。可以很直接的估计θ的方法

EMD示例python代码 python emd算法_EM算法_02

这样的估计是统计上的极大似然估计的结果。用 P (X, Z | θ) 来表示 X,Z 的联合概率分布(其中带有参数 θ),对于上面的实验,可以计算出现观察到的结果:

即 x0 = (5, 9, 8, 4, 7), z0 = (B, A, A, B, A) 的概率。

函数 P (X = x (0) , Z = z (0) | θ) 就叫做 θ 的似然函数。

EMD示例python代码 python emd算法_参数估计_03


只知道每次试验有几次投掷出正面,但是不知道每次试验投掷的是哪个硬币,这个时候就称 Z 为 隐藏变量 (Hidden Variable),X 称为观察变量 (Observed Variable)。

此时估计参数 θA 和θB,就没有那么多数据可供使用了,这个时候的估计叫做不完整数据的参数估计。如果没有方法来获得更多的数据的话,那么利用迭代的方式来进行

EMD示例python代码 python emd算法_迭代_04


如上图所示,EM算法分为两个步骤,分别是E-step和M-step:

a.E-step:

先赋给 θ 一个初始值,可以是经验也也可以是猜测,这里给定 θA = 0.6, θB = 0.5。

判断或者猜测每次投掷更像是哪枚硬币投掷的结果。

对于上述试验,如果投掷的是 A,那么出现 5个正面的概率为prob_a = ?10 5 ×0.65×0.45 ;

如果投掷的是B,出现5个正面的概率为 ???_? = ?10 5 ×0.55×0.55;

基于上述试验的结果,可以判断:

这个试验投掷的是硬币 A 的概率为 prob_a/(prob_a+ prob_b)=0.45,

是 B 的概率为 prob_b/(prob_a+ prob_b)=0.55 。

如果是A,则正面的个数为5× prob_a/(prob_a+ prob_b) = 2.2,
反面个数为(10-5) × prob_a/(prob_a+ prob_b) = 2.2。
如果是B,则正面的个数为5× prob_b/(prob_a+ prob_b) = 2.8,
反面个数为(10-5) × prob_b/(prob_a+ prob_b) = 2.8。
b.M-step:
利用完整数据的参数估计一样 (公式2) 重新计算θ的值。
迭代 E和M 步骤直到收敛,我们就得到了θ的估计