09. EM

算法思路

之前所遇到的模型,大多是求 θ ^ = arg ⁡ max ⁡ θ P ( X , y ∣ θ ) \hat\theta=\arg\max_\theta P(X,y|\theta) θ^=argmaxθP(X,yθ),但是在一些存在隐变量的模型中,表达式 P ( X , y ∣ θ ) P(X,y|\theta) P(X,yθ)难以求解析解,所以可以通过一个迭代的算法求出其解,这个迭代的算法就称为EM算法。

算法流程

  1. 确定初始参数 θ ( 0 ) \theta^{(0)} θ(0)
  2. 计算 Q ( θ , θ ( i ) ) Q(\theta,\theta^{(i)}) Q(θ,θ(i))
    Q ( θ , θ ( i ) ) = E P ( Z ∣ X , θ ( i ) ) [ log ⁡ P ( X , Z ∣ θ ) ] \begin{aligned} Q(\theta, \theta^{(i)}) &= \mathbb E_{P(Z|X,\theta^{(i)})}[\log P(X,Z|\theta)] \end{aligned} Q(θ,θ(i))=EP(ZX,θ(i))[logP(X,Zθ)]
  3. 求解 θ ( i + 1 ) = arg ⁡ max ⁡ θ Q ( θ , θ ( i ) ) \theta^{(i+1)}=\arg\max_\theta Q(\theta,\theta^{(i)}) θ(i+1)=argmaxθQ(θ,θ(i))

收敛性证明

我们只需要证明 P ( X ∣ θ ( i + 1 ) ) > P ( X ∣ θ ( i ) ) P(X|\theta^{(i+1)})>P(X|\theta^{(i)}) P(Xθ(i+1))>P(Xθ(i))即可。
P ( Z ∣ X , θ ) ∗ P ( X ∣ θ ) = P ( X , Z ∣ θ ) log ⁡ P ( X ∣ θ ) = log ⁡ P ( X , Z ∣ θ ) − log ⁡ P ( Z ∣ X , θ ) E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( X ∣ θ ) = E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( X , Z ∣ θ ) − E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( Z ∣ X , θ ) log ⁡ P ( X ∣ θ ) = E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( X , Z ∣ θ ) − E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( Z ∣ X , θ ) log ⁡ P ( X ∣ θ ) = Q ( θ , θ ( i ) ) − E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( Z ∣ X , θ ) \begin{aligned} P(Z|X,\theta) *P(X|\theta) &= P(X,Z|\theta)\\ \log P(X|\theta) &= \log P(X,Z|\theta) - \log P(Z|X,\theta)\\ \mathbb E_{P(Z|X,\theta^{(i)})} \log P(X|\theta) &= \mathbb E_{P(Z|X,\theta^{(i)})} \log P(X,Z|\theta) - \mathbb E_{P(Z|X,\theta^{(i)})} \log P(Z|X,\theta)\\ \log P(X|\theta) &= \mathbb E_{P(Z|X,\theta^{(i)})} \log P(X,Z|\theta) - \mathbb E_{P(Z|X,\theta^{(i)})} \log P(Z|X,\theta)\\ \log P(X|\theta) &=Q(\theta, \theta^{(i)}) - \mathbb E_{P(Z|X,\theta^{(i)})} \log P(Z|X,\theta) \end{aligned} P(ZX,θ)P(Xθ)logP(Xθ)EP(ZX,θ(i))logP(Xθ)logP(Xθ)logP(Xθ)=P(X,Zθ)=logP(X,Zθ)logP(ZX,θ)=EP(ZX,θ(i))logP(X,Zθ)EP(ZX,θ(i))logP(ZX,θ)=EP(ZX,θ(i))logP(X,Zθ)EP(ZX,θ(i))logP(ZX,θ)=Q(θ,θ(i))EP(ZX,θ(i))logP(ZX,θ)
所以 D _ v a l u e = log ⁡ P ( X ∣ θ ( i + 1 ) ) − log ⁡ P ( X ∣ θ ( i ) ) D\_value = \log P(X|\theta^{(i+1)})-\log P(X|\theta^{(i)}) D_value=logP(Xθ(i+1))logP(Xθ(i))的值为:
D _ v a l u e = Q ( θ ( i + 1 ) , θ ( i ) ) − Q ( θ ( i ) , θ ( i ) ) + E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( Z ∣ X , θ ( i ) ) P ( Z ∣ X , θ ( i + 1 ) ) = Q ( θ ( i + 1 ) , θ ( i ) ) − Q ( θ ( i ) , θ ( i ) ) + D K L ( P ( Z ∣ X , θ ( i ) ) ∥ P ( Z ∣ X , θ ( i + 1 ) ) ) \begin{aligned} D\_value &= Q(\theta^{(i+1)},\theta^{(i)}) - Q(\theta^{(i)},\theta^{(i)}) + \mathbb E_{P(Z|X,\theta^{(i)})}\log \frac{P(Z|X, \theta^{(i)})}{P(Z|X, \theta^{(i+1)})}\\ &= Q(\theta^{(i+1)},\theta^{(i)}) - Q(\theta^{(i)},\theta^{(i)}) + D_{KL}(P(Z|X,\theta^{(i)})\| P(Z|X,\theta^{(i+1)})) \end{aligned} D_value=Q(θ(i+1),θ(i))Q(θ(i),θ(i))+EP(ZX,θ(i))logP(ZX,θ(i+1))P(ZX,θ(i))=Q(θ(i+1),θ(i))Q(θ(i),θ(i))+DKL(P(ZX,θ(i))P(ZX,θ(i+1)))
由于 Q ( θ ( i + 1 ) , θ ( i ) ) = max ⁡ Q ( θ , θ ( i ) ) ≥ Q ( θ ( i ) , θ ( i ) ) Q(\theta^{(i+1)},\theta^{(i)})=\max Q(\theta,\theta^{(i)}) \ge Q(\theta^{(i)},\theta^{(i)}) Q(θ(i+1),θ(i))=maxQ(θ,θ(i))Q(θ(i),θ(i)),又因为差值 D _ v a l u e ≥ 0 D\_value\ge 0 D_value0,所以算法收敛。

算法导出

虽然我们知道EM算法流程,但是我们不知道如何导出EM算法。
仿照贝叶斯神经网络时的推导,我们假设 Z ∼ q ( Z ) Z\sim q(Z) Zq(Z),那么我们对等式 log ⁡ P ( X ∣ θ ) = log ⁡ P ( X , Z ∣ θ ) − log ⁡ P ( Z ∣ X , θ ) \log P(X|\theta) = \log P(X,Z|\theta) - \log P(Z|X,\theta) logP(Xθ)=logP(X,Zθ)logP(ZX,θ)求期望得:
log ⁡ P ( X ∣ θ ) = log ⁡ P ( X , Z ∣ θ ) − log ⁡ P ( Z ∣ X , θ ) = log ⁡ P ( X , Z ∣ θ ) q ( Z ) − log ⁡ P ( Z ∣ X , θ ) q ( Z ) = E q ( Z ) log ⁡ P ( X , Z ∣ θ ) q ( Z ) − D K L ( q ( Z ) ∥ P ( Z ∣ X , θ ) ) \begin{aligned} \log P(X|\theta) &=\log P(X,Z|\theta) - \log P(Z|X,\theta)\\ &= \log \frac{P(X,Z|\theta)}{q(Z)} - \log \frac{P(Z|X,\theta)}{q(Z)}\\ &= \mathbb E_{q(Z)}\log \frac{P(X,Z|\theta)}{q(Z)}-D_{KL} (q(Z)\|P(Z|X,\theta)) \end{aligned} logP(Xθ)=logP(X,Zθ)logP(ZX,θ)=logq(Z)P(X,Zθ)logq(Z)P(ZX,θ)=Eq(Z)logq(Z)P(X,Zθ)DKL(q(Z)P(ZX,θ))
我们知道当 q ( Z ) = P ( Z ∣ X , θ ) q(Z)=P(Z|X,\theta) q(Z)=P(ZX,θ)时, D K L = 0 D_{KL}=0 DKL=0。令 q ( Z ) = P ( Z ∣ X , θ ) q(Z)=P(Z|X,\theta) q(Z)=P(ZX,θ)得:
log ⁡ P ( X ∣ θ ) = E P ( Z ∣ X , θ ) log ⁡ P ( X , Z ∣ θ ) P ( Z ∣ X , θ ) \begin{aligned} \log P(X|\theta) &=\mathbb E_{P(Z|X,\theta)}\log \frac{P(X,Z|\theta)}{P(Z|X,\theta)} \end{aligned} logP(Xθ)=EP(ZX,θ)logP(ZX,θ)P(X,Zθ)
但是这一步仍然不可解,所以采用迭代算法策略: log ⁡ P ( X ∣ θ ) = E P ( Z ∣ X , θ ( i ) ) log ⁡ P ( X , Z ∣ θ ) P ( Z ∣ X , θ ( i ) ) \log P(X|\theta) =\mathbb E_{P(Z|X,\theta^{(i)})}\log \frac{P(X,Z|\theta)}{P(Z|X,\theta^{(i)})} logP(Xθ)=EP(ZX,θ(i))logP(ZX,θ(i))P(X,Zθ),由于 log ⁡ \log log下面得分母与优化过程无关,所以略去。
所以导出EM算法。

代码实现

import numpy as np
import random

def load_data(mus, sigmas, alphas, length):
    assert(len(mus) == len(sigmas) and len(mus) == len(alphas))
    lengths = [round(length * alpha) for alpha in alphas]
    data = []
    for mu, sigma, length in zip(mus, sigmas, lengths):
        data.extend(np.random.normal(mu, sigma, length))
    random.shuffle(data)
    return np.array(data)


def gaussian(data, mu, sigma):
    return np.exp(-(data - mu)**2 / 2 / sigma**2) / np.sqrt(2 * np.pi) / sigma


def train(data, mus, sigmas, alphas, epochs):
    for epoch in range(epochs):
        gammas, gamma_sum = [], 0
        for alpha, mu, sigma in zip(alphas, mus, sigmas):
            gamma = alpha * gaussian(data, mu, sigma)
            gammas.append(gamma)
            gamma_sum += gamma
        for i in range(len(mus)):
            gammas[i] /= gamma_sum
            mus[i] = np.dot(gammas[i], data) / np.sum(gammas[i])
            sigmas[i] = np.sqrt(np.dot(gammas[i], (data - mus[i])**2) / np.sum(gammas[i]))
            alphas[i] = np.sum(gammas[i]) / len(gammas[i])
    return mus, sigmas, alphas


if __name__ == '__main__':
    mus, sigmas, alphas = [0.7, 0.5], [1, 2], [0.3, 0.7]
    data = load_data(mus, sigmas, alphas, 10000)
    mus, sigmas, alphas = train(data, [0, 1], [1, 1], [0.5, 0.5], 10000)
    print(mus, sigmas, alphas)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值