EM算法学习笔记

Expectation Maximization Algorithm

1 极大似然估计(Maximum Likelihood Estimate)

极大似然估计思想:若已知某事件A发生有多种概率可能性 P 1 , P 2 . . . P n P_1,P_2...P_n P1,P2...Pn,则认为其中最大的概率为事件A发生的概率。

极大似然估计的通常解法:

①构造似然函数
L ( θ 1 , θ 2 , . . . , θ n ) = { ∏ i = 1 n P ( x i ; θ 1 , θ 2 , . . . , θ n ) ∏ i = 1 n f ( x i ; θ 1 , θ 2 , . . . , θ n ) L(\theta_1,\theta_2,...,\theta_n)=\left\{ \begin{array}{ll} \prod_{i=1}^{n}P(x_i;\theta_1,\theta_2,...,\theta_n)\\\\ \prod_{i=1}^{n}f(x_i;\theta_1,\theta_2,...,\theta_n) \end{array} \right. L(θ1,θ2,...,θn)=i=1nP(xi;θ1,θ2,...,θn)i=1nf(xi;θ1,θ2,...,θn)
②对似然函数取对数

③两边同时求导

④令导数等于为0,解似然方程

2 期望极大算法(Expectation Maximization Algorithm)

2.1 基本思想

假设有两个数据集 A 、 B A、B AB A ∼ N ( μ , σ 2 ) 、 B ∼ N ( μ , σ 2 ) A\sim{N(\mu,\sigma^2)}、B\sim{N(\mu,\sigma^2)} AN(μ,σ2)BN(μ,σ2),通过MLE我们快速的求出 μ 1 ^ , σ 1 2 ^ , μ 2 ^ , σ 2 2 ^ \hat{\mu_1},\hat{\sigma_1^2},\hat{\mu_2},\hat{\sigma_2^2} μ1^,σ12^,μ2^,σ22^

若将 A 、 B A、B AB两个数据集混合,如何求 μ 1 ^ , σ 1 2 ^ , μ 2 ^ , σ 2 2 ^ \hat{\mu_1},\hat{\sigma_1^2},\hat{\mu_2},\hat{\sigma_2^2} μ1^,σ12^,μ2^,σ22^

想要解决这个问题就需要使用到EM算法:

①首先给 μ 1 , σ 1 2 , μ 2 , σ 2 2 \mu_1,\sigma_1^2,\mu_2,\sigma_2^2 μ1,σ12,μ2,σ22设定一个初始值,即 μ 1 ( 0 ) , σ 1 2 ( 0 ) , μ 2 ( 0 ) , σ 2 2 ( 0 ) \mu_1^{(0)},{\sigma_1^2}^{(0)},\mu_2^{(0)},{\sigma_2^2}^{(0)} μ1(0),σ12(0),μ2(0),σ22(0)

②利用已知的 μ 1 ( i ) , σ 1 2 ( i ) , μ 2 ( i ) , σ 2 2 ( i ) \mu_1^{(i)},{\sigma_1^2}^{(i)},\mu_2^{(i)},{\sigma_2^2}^{(i)} μ1(i),σ12(i),μ2(i),σ22(i)去判断数据集中的每个样本是属于数据集 A A A还是数据集 B B B,并将数据集重新标注

③利用重新标注的数据集通过MLE得到新的 μ 1 , σ 1 2 , μ 2 , σ 2 2 \mu_1,\sigma_1^2,\mu_2,\sigma_2^2 μ1,σ12,μ2,σ22

④重复②、③直至 μ 1 , σ 1 2 , μ 2 , σ 2 2 \mu_1,\sigma_1^2,\mu_2,\sigma_2^2 μ1,σ12,μ2,σ22收敛

2.2 EM算法

输入:观测变量数据 Y Y Y,隐变从量数据 Z Z Z,联合分布 P ( Y , Z ∣ θ ) P(Y,Z\mid \theta) P(Y,Zθ),条件分布 P ( Z ∣ Y , θ ) P(Z\mid Y,\theta) P(ZY,θ)

输出:模型参数 θ \theta θ

(1) 选择模型参数的初始值 θ ( 0 ) \theta^{(0)} θ(0),开始迭代;

(2) E步:记 θ ( i ) \theta^{(i)} θ(i) 表示第 i i i 次迭代参数 θ \theta θ 的估计值,在第 i + 1 i+1 i+1 次迭代的E步,计算
Q ( θ , θ ( i ) ) = E Z [ log ⁡ P ( Y , Z ∣ θ ) ∣ Y , θ ( i ) ] = ∑ Z log ⁡ P ( Y , Z ∣ θ ) P ( Z ∣ Y , θ ( i ) ) \begin{aligned} Q(\theta,\theta^{(i)})&=E_Z[\log P(Y,Z\mid \theta)\mid Y,\theta^{(i)}] \\&=\sum_Z\log P(Y,Z\mid \theta)P(Z\mid Y,\theta^{(i)}) \end{aligned} Q(θ,θ(i))=EZ[logP(Y,Zθ)Y,θ(i)]=ZlogP(Y,Zθ)P(ZY,θ(i))
(3) M步:求使 Q ( θ , θ ( i ) ) Q(\theta,\theta^{(i)}) Q(θ,θ(i)) 极大化的 θ \theta θ,确定第 i + 1 i + 1 i+1 次迭代的参数的估计值 θ ( i + 1 ) \theta^{(i+1)} θ(i+1)
θ ( i + 1 ) = arg ⁡ max ⁡ Q ( θ , θ ( i ) ) \theta^{(i+1)}=\arg \max Q(\theta,\theta^{(i)}) θ(i+1)=argmaxQ(θ,θ(i))
(4) 重复第(2)步和第(3)步,直到收敛。

2.3 数学推导

假设目标函数为 L ( θ ) = ∏ P θ ( y i ) L(\theta)=\prod{P_\theta(y_i)} L(θ)=Pθ(yi),其中 θ \theta θ 为需要求解的参数

在没有隐变量(未观测变量)的情况下,求解 L ( θ ) L(\theta) L(θ) 的最大值的一般步骤:
① : ln ⁡ L ( θ ) = ∑ ln ⁡ P θ ( y i ) ② : d ln ⁡ L ( θ ) d θ = d ∑ ln ⁡ P θ ( y i ) d θ = 0 ③ : 设 θ 0 满 足 上 述 表 达 式 , 则 max ⁡ ( L ( θ ) ) = L ( θ 0 ) \begin{aligned} &①:\ln{L(\theta)}=\sum{\ln{P_\theta(y_i)}}\\&②:\frac{\mathrm{d} \ln{L(\theta)}}{\mathrm{d} \theta} =\frac{\mathrm{d} \sum{\ln{P_\theta(y_i)}}}{\mathrm{d} \theta}=0 \\&③:设\theta_0满足上述表达式,则\max (L(\theta))=L(\theta_0) \end{aligned} lnL(θ)=lnPθ(yi)dθdlnL(θ)=dθdlnPθ(yi)=0θ0max(L(θ))=L(θ0)
在概率函数中存在隐变量时,由全概率公式 P ( B ) = ∑ P ( A i ) P ( B ∣ A i ) P(B)=\sum{P(A_i)}P(B\mid{A_i}) P(B)=P(Ai)P(BAi) 可得:

P θ ( y i ) = ∑ z P θ ( z ) P θ ( y i ∣ z ) P_{\theta}(y_i)=\sum_{z}P_{\theta}(z)P_{\theta}(y_i\mid{z}) Pθ(yi)=zPθ(z)Pθ(yiz),其中 z z z 为隐变量:
∴ L ( θ ) = ∏ ∑ z P θ ( z ) P θ ( y i ∣ z ) \therefore L(\theta)=\prod \sum_{z}P_\theta(z)P_\theta(y_i\mid z) L(θ)=zPθ(z)Pθ(yiz)
两边同时取对数:
∴ ln ⁡ L ( θ ) = ∑ ln ⁡ ∑ z P θ ( z ) P θ ( y i ∣ z ) \therefore \ln L(\theta)=\sum \ln \sum_{z} P_{\theta}(z) P_{\theta}(y_i \mid z) lnL(θ)=lnzPθ(z)Pθ(yiz)
由于 ln ⁡ \ln ln 项中有和式,在偏导数的情况下会非常复杂,因此使用迭代的方式求解析解的近似解。

设第 n n n 次计算出来的 θ \theta θ θ ( n ) \theta^{(n)} θ(n),第 n + 1 n+1 n+1 次计算出来的 θ \theta θ θ ( n + 1 ) \theta^{(n+1)} θ(n+1),则:
∴ ln ⁡ L ( θ ( n + 1 ) ) − ln ⁡ L ( θ ( n ) ) = ∑ ln ⁡ ∑ z P θ ( n + 1 ) ( z ) P θ ( n + 1 ) ( y i ∣ z ) − ∑ ln ⁡ P θ ( n ) ( z ) P θ ( n ) ( y i ∣ z ) \therefore \ln L(\theta^{(n+1)})-\ln L(\theta^{(n)})=\sum \ln \sum_z P_{\theta^{(n+1)}}(z)P_{\theta^{(n+1)}}(y_i\mid z)-\sum \ln P_{\theta^{(n)}}(z)P_{\theta^{(n)}}(y_i\mid z) lnL(θ(n+1))lnL(θ(n))=lnzPθ(n+1)(z)Pθ(n+1)(yiz)lnPθ(n)(z)Pθ(n)(yiz)

由于 θ ( n ) \theta^{(n)} θ(n) 已经求出,所以 θ ( n ) \theta^{(n)} θ(n) 是一个已知常数,因此右式中的第二项中的隐变量不用表示体现出来。
∴ ln ⁡ L ( θ ( n + 1 ) ) − ln ⁡ L ( θ ( n ) ) = ∑ [ ln ⁡ ∑ z P θ ( n + 1 ) ( z ) P θ ( n + 1 ) ( y i ∣ z ) − ln ⁡ P θ ( n ) ( y i ) ] \therefore \ln L(\theta^{(n+1)})-\ln L(\theta^{(n)})=\sum{[\ln \sum_z P_{\theta^{(n+1)}}(z)P_{\theta^{(n+1)}}(y_i\mid z)-\ln P_{\theta^{(n)}}(y_i) ]} lnL(θ(n+1))lnL(θ(n))=[lnzPθ(n+1)(z)Pθ(n+1)(yiz)lnPθ(n)(yi)]

上式经过化简之后可得:
ln ⁡ L ( θ ( n + 1 ) ) ≥ ∑ i = 1 N ∑ z P θ ( n ) ( z ∣ y i ) [ ln ⁡ P θ ( n + 1 ) ( y i , z ) P θ ( n ) ( z , y i ) ] + ln ⁡ L ( θ ( n ) ) \ln L(\theta^{(n+1)}) \ge \sum_{i=1}^{N} \sum_{z}P_{\theta^{(n)}}(z\mid y_i)[\ln \frac{P_{\theta^{(n+1)}}(y_i,z)}{P_{\theta^{(n)}}(z,y_i)}]+\ln L(\theta^{(n)}) lnL(θ(n+1))i=1NzPθ(n)(zyi)[lnPθ(n)(z,yi)Pθ(n+1)(yi,z)]+lnL(θ(n))
记右式为 Q ( θ ( n + 1 ) ∣ θ ( n ) ) Q(\theta^{(n+1)}\mid \theta^{(n)}) Q(θ(n+1)θ(n)),该函数称为下边界函数。

EM算法的目的是要取得目标函数的极大值,那么可以不断地提升下边界函数值来提升目标函数的值,直至收敛。
∴ Q ( θ ( n + 1 ) ∣ θ ( n ) )   = ∑ i = 1 N ∑ z P θ ( n ) ( z ∣ y i ) [ ln ⁡ P θ ( n + 1 ) ( y i , z ) P θ ( n ) ( z , y i ) ] + ln ⁡ L ( θ ( n ) ) = ∑ i = 1 N ∑ z P θ ( n ) ( z ∣ y i ) ln ⁡ P θ ( n + 1 ) ( y i , z ) − ∑ i = 1 N ∑ z P θ ( n ) ( z ∣ y i ) ln ⁡ P θ ( n ) ( z , y i ) + ln ⁡ L ( θ ( n ) ) \begin{aligned} \therefore Q(\theta^{(n+1)}\mid \theta^{(n)})\ &=\sum_{i=1}^{N} \sum_{z}P_{\theta^{(n)}}(z\mid y_i)[\ln \frac{P_{\theta^{(n+1)}}(y_i,z)}{P_{\theta^{(n)}}(z,y_i)}]+\ln L(\theta^{(n)})\\ &=\sum_{i=1}^{N} \sum_{z}P_{\theta^{(n)}}(z\mid y_i)\ln P_{\theta^{(n+1)}}(y_i,z)-\sum_{i=1}^{N} \sum_{z}P_{\theta^{(n)}}(z\mid y_i)\ln P_{\theta^{(n)}}(z,y_i) + \ln L(\theta^{(n)}) \end{aligned} Q(θ(n+1)θ(n)) =i=1NzPθ(n)(zyi)[lnPθ(n)(z,yi)Pθ(n+1)(yi,z)]+lnL(θ(n))=i=1NzPθ(n)(zyi)lnPθ(n+1)(yi,z)i=1NzPθ(n)(zyi)lnPθ(n)(z,yi)+lnL(θ(n))
上述右式中只有第一项含有未知参数 θ ( n + 1 ) \theta^{(n+1)} θ(n+1),那么接下来我们只需要令 ∂ Q ( θ ( n + 1 ) ∣ θ ( n ) ) ∂ θ ( n + 1 ) = 0 \frac{\partial Q(\theta^{(n+1)}\mid \theta^{(n)})}{\partial \theta^{(n+1)}}=0 θ(n+1)Q(θ(n+1)θ(n))=0,即可求出 θ ( n + 1 ) = arg ⁡ max ⁡ ( Q ( θ ( n + 1 ) ∣ θ ( n ) ) ) \theta^{(n+1)}=\arg\max(Q(\theta^{(n+1)}\mid \theta^{(n)})) θ(n+1)=argmax(Q(θ(n+1)θ(n))),将求出的 θ ( n + 1 ) \theta^{(n+1)} θ(n+1) 代入 Q ( θ ( n + 2 ) ∣ θ ( n + 1 ) ) Q(\theta^{(n+2)}\mid \theta^{(n+1)}) Q(θ(n+2)θ(n+1)) 即可求出 θ ( n + 2 ) \theta^{(n+2)} θ(n+2) …然后不断的迭代直至 θ \theta θ 收敛,我们便可以求出满足条件的 θ \theta θ

2.4 Python代码实现

三硬币模型

题面:

假设有3枚硬币,分别记作A,B,C。这些硬币正面出现的概率分别为 π , p \pi,p π,p q q q。进行如下抛硬币试验:先抛硬币A,根据其结果选出硬币B或硬币C,正面选硬币B,反面选硬币C;然后掷选出的硬币,掷硬币的结果,出现正面记作1,出现反面记作0;独立地重复 n n n 次试验(这里,n=10),观测结果如下:
1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 1 1,1,0,1,0,0,1,0,1,1 1,1,0,1,0,0,1,0,1,1
假设只能观测到掷硬币的结果,不能观测掷硬币的过程。问如何估计三硬币正面出现的概率,即三硬币模型的参数。

解:

因为 P ( A 硬 币 正 面 ) = π , P ( B 硬 币 正 面 ) = p , P ( C 硬 币 正 面 ) = q P(A硬币正面)=\pi,P(B硬币正面)=p,P(C硬币正面)=q P(A)=π,P(B)=p,P(C)=q,设 y y y 为某一次试验的观测量, θ = ( π , p , q ) \theta=(\pi,p,q) θ=(π,p,q) 为模型参数
∴ P ( y = 1 ∣ θ ) = π p + ( 1 − π ) q ∴ P ( y = 0 ∣ θ ) = π ( 1 − p ) + ( 1 − π ) ( 1 − q ) ∴ P ( y ∣ θ ) = π p y ( 1 − q ) 1 − y + ( 1 − π ) q y ( 1 − p ) 1 − y \begin{aligned} &\therefore P(y=1\mid\theta)=\pi p+(1-\pi)q\\ &\therefore P(y=0\mid\theta)=\pi(1-p)+(1-\pi)(1-q)\\ &\therefore P(y\mid\theta)=\pi p^y(1-q)^{1-y}+(1-\pi)q^y(1-p)^{1-y} \end{aligned} P(y=1θ)=πp+(1π)qP(y=0θ)=π(1p)+(1π)(1q)P(yθ)=πpy(1q)1y+(1π)qy(1p)1y
Y = ( y 1 , y 2 , . . . , y n ) T , Z = ( z 1 , z 2 , . . . , z n ) T Y=(y_1,y_2,...,y_n)^T,Z=(z_1,z_2,...,z_n)^T Y=(y1,y2,...,yn)T,Z=(z1,z2,...,zn)T
∵ P ( y ∣ θ ) = ∑ Z P ( y , z ∣ θ ) = ∑ Z P ( y , z , θ ) P ( θ ) = ∑ Z P ( z ∣ θ ) P ( y ∣ z , θ ) \begin{aligned} \because P(y\mid \theta)=\sum_ZP(y,z\mid\theta)=\sum_Z\frac{P(y,z,\theta)}{P(\theta)}=\sum_ZP(z\mid\theta)P(y\mid z,\theta)\\ \end{aligned} P(yθ)=ZP(y,zθ)=ZP(θ)P(y,z,θ)=ZP(zθ)P(yz,θ)

P ( Y ∣ θ ) = ∑ Z P ( z ∣ θ ) P ( Y ∣ z , θ ) = ∏ j = 1 n [ π p y j ( 1 − p ) 1 − y j + ( 1 − π ) q y j ( 1 − q ) 1 − y j ] \begin{aligned} P(Y\mid\theta)=&\sum_ZP(z\mid\theta)P(Y\mid z,\theta)\\=&\prod_{j=1}^{n}[\pi p^{y_j}(1-p)^{1-y_j}+(1-\pi)q^{y_j}(1-q)^{1-y_j}] \end{aligned} P(Yθ)==ZP(zθ)P(Yz,θ)j=1n[πpyj(1p)1yj+(1π)qyj(1q)1yj]

log-likelihood:
l ( θ ) = log ⁡ P ( Y ∣ θ ) = ∑ j = 1 n log ⁡ [ π p y j ( 1 − p ) 1 − y j + ( 1 − π ) q y j ( 1 − q ) 1 − y j ] l(\theta)=\log P(Y\mid \theta)=\sum_{j=1}^{n}\log [\pi p^{y_j}(1-p)^{1-y_j}+(1-\pi)q^{y_j}(1-q)^{1-y_j}] l(θ)=logP(Yθ)=j=1nlog[πpyj(1p)1yj+(1π)qyj(1q)1yj]
E-step
Q ( θ ∣ θ ( i ) ) = E Z [ log ⁡ P ( Y , Z ∣ θ ) ∣ Y , θ ( i ) ] = ∑ Z [ ( log ⁡ P ( Y , Z ∣ θ ) ) P ( Z ∣ Y , θ ( i ) ) ] = [ P ( z = 1 ∣ Y , θ ( i ) ) log ⁡ P ( Y , z = 1 ∣ θ ) + P ( z = 0 ∣ Y , θ ( i ) ) log ⁡ P ( Y , z = 0 ∣ θ ) ] = ∑ j = 1 n [ P ( z = 1 ∣ y j , θ ( i ) ) log ⁡ P ( y j , z = 1 ∣ θ ) + P ( z = 0 ∣ y j , θ ( i ) ) log ⁡ P ( y j , z = 0 ∣ θ ) ] \begin{aligned} Q(\theta\mid\theta^{(i)})=&E_Z[\log P(Y,Z\mid\theta)\mid Y,\theta^{(i)}]\\=&\sum_Z[(\log P(Y,Z\mid\theta))P(Z\mid Y,\theta^{(i)})]\\=&[P(z=1|Y,\theta^{(i)})\log P(Y,z=1\mid\theta)+P(z=0\mid Y,\theta^{(i)})\log P(Y,z=0\mid\theta)]\\=&\sum_{j=1}^n[P(z=1|y_j,\theta^{(i)})\log P(y_j,z=1\mid\theta)+P(z=0\mid y_j,\theta^{(i)})\log P(y_j,z=0\mid\theta)] \end{aligned} Q(θθ(i))====EZ[logP(Y,Zθ)Y,θ(i)]Z[(logP(Y,Zθ))P(ZY,θ(i))][P(z=1Y,θ(i))logP(Y,z=1θ)+P(z=0Y,θ(i))logP(Y,z=0θ)]j=1n[P(z=1yj,θ(i))logP(yj,z=1θ)+P(z=0yj,θ(i))logP(yj,z=0θ)]
设在模型参数为 θ ( i ) \theta^{(i)} θ(i) 下观测数据 y j y_j yj 来自 B 的概率为 μ j \mu_j μj
∴ μ j ( i + 1 ) = P ( z = 1 ∣ y j , θ ( i ) ) = π ( i ) ( p ( i ) ) y j ( 1 − p ( i ) ) 1 − y j π ( i ) ( p ( i ) ) y j ( 1 − p ( i ) ) 1 − y j + ( 1 − π ( i ) ) ( q ( i ) ) y j ( 1 − q ( i ) ) 1 − y j \therefore \mu_j^{(i+1)}=P(z=1\mid y_j,\theta^{(i)})=\frac{\pi^{(i)} (p^{(i)})^{y_j}(1-p^{(i)})^{1-y_j}}{\pi^{(i)} (p^{(i)})^{y_j}(1-p^{(i)})^{1-y_j}+(1-\pi^{(i)})(q^{(i)})^{y_j}(1-q^{(i)})^{1-y_j}} μj(i+1)=P(z=1yj,θ(i))=π(i)(p(i))yj(1p(i))1yj+(1π(i))(q(i))yj(1q(i))1yjπ(i)(p(i))yj(1p(i))1yj

∵ P ( y j , z = 1 ∣ θ ) = π p y j ( 1 − p ) 1 − y j \because P(y_j,z=1\mid\theta)=\pi p^{y_j}(1-p)^{1-y_j} P(yj,z=1θ)=πpyj(1p)1yj

∴ Q ( θ ∣ θ ( i ) ) = ∑ j = 1 n { μ j ( i + 1 ) log ⁡ [ π p y j ( 1 − p ) ( 1 − y j ) ] + ( 1 − μ j ( i + 1 ) ) log ⁡ [ ( 1 − π ) q y j ( 1 − q ) ( 1 − y j ) ] } \therefore Q(\theta\mid\theta^{(i)})=\sum_{j=1}^n\{\mu_j^{(i+1)}\log [\pi p^{y_j}(1-p)^{(1-y_j)}]+(1-\mu_j^{(i+1)})\log[(1-\pi)q^{y_j}(1-q)^{(1-y_j)}] \} Q(θθ(i))=j=1n{μj(i+1)log[πpyj(1p)(1yj)]+(1μj(i+1))log[(1π)qyj(1q)(1yj)]}

M-step:计算模型参数行的估计值 θ ( i + 1 ) \theta^{(i+1)} θ(i+1)

π \pi π
令 ∂ Q ( θ ∣ θ ( i ) ) ∂ π = 0 ∴ π ( i + 1 ) = 1 n ∑ j = 1 n μ j ( i + 1 ) 令\frac{\partial Q(\theta\mid\theta^{(i)})}{\partial\pi}=0\\ \therefore \pi^{(i+1)}=\frac{1}{n}\sum_{j=1}^n\mu_j^{(i+1)} πQ(θθ(i))=0π(i+1)=n1j=1nμj(i+1)
p p p
令 ∂ Q ( θ ∣ θ ( i ) ) ∂ p = 0 ∴ p ( i + 1 ) = ∑ j = 1 n μ j ( i + 1 ) y j ∑ j = 1 n μ j ( i + 1 ) 令\frac{\partial Q(\theta\mid\theta^{(i)})}{\partial p}=0\\ \therefore p^{(i+1)}=\frac{\sum_{j=1}^n\mu_j^{(i+1)}y_j}{\sum_{j=1}^n\mu_j^{(i+1)}} pQ(θθ(i))=0p(i+1)=j=1nμj(i+1)j=1nμj(i+1)yj

q q q
令 ∂ Q ( θ ∣ θ ( i ) ) ∂ q = 0 ∴ q ( i + 1 ) = ∑ j = 1 n ( 1 − μ j ( i + 1 ) ) y j ∑ j = 1 n ( 1 − μ j ( i + 1 ) ) 令\frac{\partial Q(\theta\mid\theta^{(i)})}{\partial q}=0\\ \therefore q^{(i+1)}=\frac{\sum_{j=1}^n(1-\mu_j^{(i+1)})y_j}{\sum_{j=1}^n(1-\mu_j^{(i+1)})} qQ(θθ(i))=0q(i+1)=j=1n(1μj(i+1))j=1n(1μj(i+1))yj

import numpy
import math

class EM:
    def __init__(self, prob):
        self.prob_A, self.prob_B, self.prob_C = prob
#     e-step
    def expectation(self, j):
        '''
        计算出对于每一个y_j来自B的概率\mu_j
        '''
        prob_1 = self.prob_A * math.pow(self.prob_B, data[j]) * math.pow(1 - self.prob_B, 1 -data[j])  # B,即 z=1
        prob_0 = (1 - self.prob_A) * math.pow(self.prob_C, data[j]) * math.pow(1 - self.prob_C, 1- data[j])  # C,即 z=0
        return prob_1 / (prob_1 + prob_0)  # 返回 \mu_j

#     m-step
    def maximization(self, data):
        count = len(data)  # n
        print('init prob:{},{},{}'.format(self.prob_A, self.prob_B, self.prob_C))
        for d in range(count):
            _ = yield
            mu = [self.expectation(j) for j in range(count)]  # 得到\mu向量
            prob_A = 1 / count * sum(mu)  # 计算新的 \pi
            prob_B = sum([mu[j] * data[j] for j in range(count)]) / sum([mu[j] for j in range(count)])  # 计算新的 p
            prob_C = sum([(1 - mu[j]) * data[j] for j in range(count)]) / sum([(1 - mu[j]) for j in range(count)])  # 计算新的 q
            print('{}/{} prob_A:{:.3f}, prob_B:{:.3f}, prob_C:{:.3f}'.format(d, count, prob_A, prob_B, prob_C))
            self.prob_A = prob_A  # 赋值
            self.prob_B = prob_B  # 赋值
            self.prob_C = prob_C  # 赋值
data = [1, 1, 0, 1, 0, 0, 1, 0, 1, 1]  # 可观测数据集 Y
em = EM(prob=[0.5, 0.5, 0.5])
f = em.maximization(data)
next(f)
f.send(1)
f.send(2)
em = EM(prob=[0.4, 0.6, 0.7])
f = em.maximization(data)
next(f)
f.send(1)
f.send(2)

参考资料

什么是 EM 算法(最大期望算法)?【知多少】

【机器学习】【白板推导系列】【合集 1~23】

如何通俗理解EM算法

西瓜书 p162

如何感性地理解EM算法?

从最大似然到EM算法浅解

【机器学习】EM——期望最大(非常详细)

期望最大

【机器学习基础】EM算法

机器学习——EM算法及代码实现

统计学习方法 第九章

《统计学习方法》第二版的代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值