EM 算法通俗简明详细系统介绍

1)EM 算法之目的 一种通过迭代的期望最大化算法(Expectation-Maximization Algorithm)
\qquad 通过观察数据,获取模型参数。例如 x 1 , x 2 , . . . , x n x_{1},x_{2},...,x_{n} x1,x2,...,xn,为某班男女同学身高,其中,男生身高服从高斯分布1: N 1 ( μ 1 , σ 1 ) \Nu_{1}(\mu_{1},\sigma_{1}) N1(μ1,σ1);女生身高服从高斯分布2: N 2 ( μ 2 , σ 2 ) \Nu_{2}(\mu_{2},\sigma_{2}) N2(μ2,σ2);没有其他性别。求:男女分布的参数 μ 1 , σ 1 , μ 2 , σ 2 \mu_{1},\sigma_{1},\mu_{2},\sigma_{2} μ1,σ1,μ2,σ2)

2)EM 算法之难点
\qquad 不知道谁是男是女。。。。。
\qquad 不知道男女比例。。。。。
有隐变量(记为:z)在问题中,有点不好搞。

3)EM 算法之通用说明
在这里插入图片描述
符号说明:
观察值 X: x 1 , x 2 , . . . , x n x_{1},x_{2},...,x_{n} x1,x2,...,xn
分布参数 θ \theta θ : 含各类分布参数
隐变量z:例如上例中的男女
概率 p ( X ∣ θ ) \red {p(X|\theta)} p(Xθ):在 θ \theta θ已知条件下, x 1 , x 2 , . . . , x n x_{1},x_{2},...,x_{n} x1,x2,...,xn 出现的概率,极大似然的目标函数。
概率 p ( X ∣ z , θ ) p(X|z,\theta) p(Xz,θ):在z, θ \theta θ已知条件下,X 出现的概率, 这货好算,相当于知道了是男娃子还是女娃子。
概率 p ( X , z ∣ θ ) \red{p(X,z|\theta)} p(X,zθ):在 θ \theta θ已知条件下,同时X和z的概率。这货嘛,如果知道了男女娃子的先验概率,也好算。由于男同学概率+女同学概率=1.0,所以有: ∑ z p ( X , z ∣ θ ) = p ( X ∣ θ ) \red{\sum_{z}p(X,z|\theta)=p(X|\theta)} zp(X,zθ)=p(Xθ),z被积掉了。

4)EM 算法之三个基础知识

  • 贝叶斯公式 P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A|B)=\frac{P(A)P(B|A)}{P(B)} P(AB)=P(B)P(A)P(BA), 不说了,好懂的。

  • 极大似然估计法 l ( θ ) = p ( X ∣ θ ) l(\theta) = p(X|\theta) l(θ)=p(Xθ) = ∏ i = 1 n p ( x i ∣ θ ) \prod_{i=1}^np(x_{i}|\theta) i=1np(xiθ)

    实际中常用对数最大似然: l n l ( θ ) ln l(\theta) lnl(θ)= ∑ i = 1 n l n p ( x i ∣ θ ) \sum_{i=1}^nlnp(x_{i}|\theta) i=1nlnp(xiθ)

    即: θ ^ = arg ⁡ max ⁡ θ ∑ i = 1 n l n ( p ( x i ∣ θ ) ) \red{\hat\theta=\mathop{\arg\max}\limits_{\theta}\sum_{i=1}^nln(p(x_{i}|\theta))} θ^=θargmaxi=1nln(p(xiθ)),相乘变成相加。
    例如:只有一种高斯分布时,化简易得:
    l n l ( θ ) lnl(\theta) lnl(θ)= ∑ i = 1 n [ − l n 2 π − 1 2 l n σ 2 − ( x i − μ ) 2 2 σ 2 ] \sum_{i=1}^n[-ln\sqrt{2\pi}-\frac{1}{2}ln\sigma^2-\frac{(x_{i}-\mu)^2}{2\sigma^2}] i=1n[ln2π 21lnσ22σ2(xiμ)2]
    ∂ l n l ( θ ) ∂ u = 0 = > μ ^ = x 1 + x 2 + . . . + x n n \frac{\partial lnl(\theta)}{\partial u }=0 =>\hat\mu=\frac{x_{1}+x_{2}+...+x_{n}}{n} ulnl(θ)=0=>μ^=nx1+x2+...+xn
    ∂ l n l ( θ ) ∂ σ 2 = 0 = > σ ^ 2 = 1 n ∑ i = 1 n ( x i − μ ) 2 \frac{\partial lnl(\theta)}{\partial \sigma^2 }=0 =>\hat\sigma^2=\frac{1}{n}\sum_{i=1}^n(x_{i}-\mu)^2 σ2lnl(θ)=0=>σ^2=n1i=1n(xiμ)2
    即: θ ^ = ( μ ^ , σ ^ 2 ) \hat\theta=(\hat\mu,\hat\sigma^2) θ^=(μ^,σ^2), θ ^ \qquad\hat\theta θ^:表示优化后的 θ \theta θ值,读:hat。

  • Jensen不等式:
    对于f(x)的凹函数:瞪眼看,有 f ( E ( x ) ) ≧ E ( f ( x ) ) \red{f(E(x))\geqq E(f(x))} f(E(x))E(f(x))
    即:x的期望的函数值 大于等于 函数值f(x)的期望
    仅当: x 1 = x 2 x_{1}=x_{2} x1=x2为同一点时, f ( E ( x ) ) = E ( f ( x ) ) f(E(x))= E(f(x)) f(E(x))=E(f(x))
    凸函数相反。
    在这里插入图片描述
    5)EM 算法之步骤
    举个例子,体验神奇:

  1. 你看到29 个同学的身高数据如下图。(是男娃子,女娃子?不是你能知道的哟!(男:17 vs 女:12),我是从上帝视角给你参考的。)
    在这里插入图片描述

  2. 已知:男娃子身高高一些,男娃子,女娃子都符合各自的正态分布。

  3. 求:男女娃子各个多少,他们的分布参数 μ 男 , σ 男 , μ 女 , σ 女 \mu_{男},\sigma_{男},\mu_{女},\sigma_{女} μ,σ,μ,σ

  4. 过程如图(请仔细看!至少读一遍, 会有代码的。)
    E: 期望步骤:求 p ( z ∣ x , θ ) , p ( z ∣ θ ) p(z|x,\theta),p(z|\theta) p(zx,θ)p(zθ)
    M: 最大化步骤:利用对数极大似然求 θ \theta θ
    在这里插入图片描述

注意: 一个人是男是女的概率 p ( z 男 ∣ x , θ ) = p ( z 男 ∣ θ ) ∗ p ( x ∣ z 男 , θ ) / p ( x ∣ θ ) − − − − i p(z_{男}|x,\theta)=p(z_{男}|\theta)*p(x|z_{男},\theta)/p(x|\theta)----i p(zx,θ)=p(zθ)p(xz,θ)/p(xθ)i
p ( z 女 ∣ x , θ ) = p ( z 女 ∣ θ ) ∗ p ( x ∣ z 女 , θ ) / p ( x ∣ θ ) − − − − i i p(z_{女}|x,\theta)=p(z_{女}|\theta)*p(x|z_{女},\theta)/p(x|\theta)----ii p(zx,θ)=p(zθ)p(xz,θ)/p(xθ)ii
有: p ( z 男 ∣ x , θ ) / p ( z 女 ∣ x , θ ) = p ( z 男 ∣ θ ) ∗ p ( x ∣ z 男 , θ ) / p ( z 女 ∣ θ ) ∗ p ( x ∣ z 女 , θ ) ,而 p ( z 男 ∣ θ ) 通过迭代提供,而 p ( x ∣ z 男 , θ ) = N 男 ( μ 男 , σ 男 ) 提供,女娃子相关类似 p(z_{男}|x,\theta)/p(z_{女}|x,\theta)=p(z_{男}|\theta)*p(x|z_{男},\theta)/p(z_{女}|\theta)*p(x|z_{女},\theta),而p(z_{男}|\theta) 通过迭代提供,而p(x|z_{男},\theta)=\Nu_{男}(\mu_{男},\sigma_{男}) 提供,女娃子相关类似 p(zx,θ)/p(zx,θ)=p(zθ)p(xz,θ)/p(zθ)p(xz,θ),而p(zθ)通过迭代提供,而p(xz,θ)=N(μ,σ)提供,女娃子相关类似
而: p ( z 男 ∣ x , θ ) + p ( z 女 ∣ x , θ ) = 1 p(z_{男}|x,\theta)+p(z_{女}|x,\theta)=1 p(zx,θ)+p(zx,θ)=1
可是算出: p ( z 男 ∣ x , θ ) , p ( z 女 ∣ x , θ ) p(z_{男}|x,\theta),p(z_{女}|x,\theta) p(zx,θ),p(zx,θ)

具体细节如excel:
在这里插入图片描述
EM 算法结果,人数:男,17.76 vs 17;女,11.24 vs 12 相差不足一个! 平均身高:男 1.73 vs1.75;女 1.64 vs1.62。

6)EM 算法之原理
对于出现的样本X:{ x 1 , x 2 , . . . , x n x_{1},x_{2},...,x_{n} x1,x2,...,xn},对数极大似然:
θ = arg ⁡ max ⁡ θ ∑ i = 1 n l n ( p ( x i ∣ θ ) ) \red{\theta=\mathop{\arg\max}\limits_{\theta}\sum_{i=1}^n ln(p(x_{i}|\theta))} θ=θargmaxi=1nln(p(xiθ))
考虑到隐变量:z: { z 1 , z 2 , . . . z_1,z_2,... z1,z2,...}
θ = arg ⁡ max ⁡ θ ∑ i = 1 n l n ∑ z p ( x i , z ∣ θ ) \red{\theta=\mathop{\arg\max}\limits_{\theta}\sum_{i=1}^n ln \sum_{z} p(x_{i},z|\theta)} θ=θargmaxi=1nlnzp(xi,zθ)

构造一个 Q ( z ) Q(z) Q(z),使得 ∑ z Q ( z ) = 1 \sum_zQ(z)=1 zQ(z)=1,而有:
θ = arg ⁡ max ⁡ θ ∑ i = 1 n l n ∑ z Q ( z ) p ( x i , z ∣ θ ) Q ( z ) \red{\theta=\mathop{\arg\max}\limits_{\theta}\sum_{i=1}^n ln \sum_{z} Q(z)\frac {p(x_{i},z|\theta)} {Q(z)}} θ=θargmaxi=1nlnzQ(z)Q(z)p(xi,zθ)

ln 为凹函数,利用Jensen不等式 f ( E ( x ) ) ≧ E ( f ( x ) ) f(E(x))\geqq E(f(x)) f(E(x))E(f(x))
θ = arg ⁡ max ⁡ θ ∑ i = 1 n l n ∑ z Q ( z ) p ( x i , z ∣ θ ) Q ( z ) ≧ θ = arg ⁡ max ⁡ θ ∑ i = 1 n ∑ z Q ( z ) l n ( p ( x i , z ∣ θ ) Q ( z ) ) \red{\theta=\mathop{\arg\max}\limits_{\theta}\sum_{i=1}^n ln \sum_{z} Q(z)\frac {p(x_{i},z|\theta)} {Q(z)} \geqq \theta=\mathop{\arg\max}\limits_{\theta}\sum_{i=1}^n \sum_{z} Q(z)ln(\frac {p(x_{i},z|\theta)} {Q(z)} ) } θ=θargmaxi=1nlnzQ(z)Q(z)p(xi,zθ)θ=θargmaxi=1nzQ(z)ln(Q(z)p(xi,zθ))
注意相等时: p ( x i , z ∣ θ ) Q ( z ) = C \red {\frac {p(x_{i},z|\theta)} {Q(z)}=C} Q(z)p(xi,zθ)=C ,C为常量。

∑ z Q ( z ) = 1 推出 ∑ z p ( x i , z ∣ θ ) = C \sum_zQ(z)=1 推出\sum_z p(x_i,z|\theta)=C zQ(z)=1推出zp(xi,zθ)=C

Q ( z i ) = p ( x i , z ∣ θ ) C =   p ( x i , z ∣ θ ) ∑ z p ( x i , z ∣ θ ) = p ( x i , z ∣ θ ) p ( x i ∣ θ ) Q(z_i)=\frac{p(x_i,z|\theta)}{C}=\frac{\ p(x_i,z|\theta)}{\sum_z p(x_i,z|\theta)}=\frac{p(x_i,z|\theta)}{p(xi|\theta)} Q(zi)=Cp(xi,zθ)=zp(xi,zθ) p(xi,zθ)=p(xiθ)p(xi,zθ)

即: Q ( z i ) = p ( x i , z ∣ θ ) p ( x i ∣ θ ) = p ( z ∣ x i , θ ) \red{Q(z_i)=\frac{p(x_i,z|\theta)}{p(xi|\theta)}=p(z|x_i,\theta)} Q(zi)=p(xiθ)p(xi,zθ)=p(zxi,θ)
相当于算出男、女比例,根据这个参数。M 对数极大似然优化: θ ^ = arg ⁡ max ⁡ θ ∑ i = 1 n ∑ z Q ( z ) l n ( p ( x i , z ∣ θ ) Q ( z ) ) \red{\hat \theta=\mathop{\arg\max}\limits_{\theta}\sum_{i=1}^n \sum_{z} Q(z)ln(\frac {p(x_{i},z|\theta)} {Q(z)} )} θ^=θargmaxi=1nzQ(z)ln(Q(z)p(xi,zθ))

例如对于 l n ( l ( θ ) ) ln(l(\theta)) ln(l(θ))其偏导,如果是高斯混合分布,k轮迭代有:
γ i , z = p ( z ∣ θ ) ∗ p ( x ∣ z , θ ) ∑ z p ( z ∣ θ ) ∗ p ( x ∣ z , θ ) \red {\gamma_{i,z}=\frac{p(z|\theta)*p(x|z,\theta)} {\sum_z p(z|\theta)*p(x|z,\theta) }} γi,z=zp(zθ)p(xz,θ)p(zθ)p(xz,θ)

μ z = γ x i ∑ i = 1 n γ \mu_z=\frac{\gamma x_i}{\sum_{i=1}^n \gamma}\quad μz=i=1nγγxi 注意:有多个类型分布,就有多个 μ z \mu_{z} μz

σ z = ∑ i = 1 n γ ( x i − u z ) 2 ∑ i = 1 n γ \sigma_z=\frac{\sum_{i=1}^n\gamma (x_i-u_z)^2}{\sum_{i=1}^n \gamma}\quad σz=i=1nγi=1nγ(xiuz)2

7)EM 算法之收敛

程序判定收敛,只证明单调递增。
在t+1 次计算, θ t \theta^{t} θt为常量, θ ( t + 1 ) \theta^{(t+1)} θ(t+1)为对数极大似然优化量
所以有
l n ( l ( θ ( t + 1 ) ) ) ≧ ∑ i = 1 n ∑ z Q ( z ) l n ( p ( x i , z ∣ θ ( t + 1 ) ) Q ( z ) ) ≧ ∑ i = 1 n ∑ z Q ( z ) l n ( p ( x i , z ∣ θ t ) Q ( z ) ) \red{ ln (l(\theta^{(t+1)})) \geqq \sum_{i=1}^n \sum_{z} Q(z)ln(\frac {p(x_{i},z|\theta^{(t+1)})} {Q(z)} ) \geqq \sum_{i=1}^n \sum_{z} Q(z)ln(\frac {p(x_{i},z|\theta^{t})} {Q(z)} ) } ln(l(θ(t+1)))i=1nzQ(z)ln(Q(z)p(xi,zθ(t+1)))i=1nzQ(z)ln(Q(z)p(xi,zθt))

又因为Q(z),求的时候有: p ( x i , z ∣ θ ) Q ( z ) = C \frac {p(x_{i},z|\theta)} {Q(z)}=C Q(z)p(xi,zθ)=C,Jensen不等式取等号:
所以有:
∑ i = 1 n ∑ z Q ( z ) l n ( p ( x i , z ∣ θ t ) Q ( z ) ) = l n ( l ( θ t ) ) \red{ \sum_{i=1}^n \sum_{z} Q(z)ln(\frac {p(x_{i},z|\theta^{t})} {Q(z)} )=ln(l(\theta^{t})) } i=1nzQ(z)ln(Q(z)p(xi,zθt))=ln(l(θt))

因此:
l n ( l ( θ ( t + 1 ) ) ) ≧ l n ( l ( θ t ) ) ln (l(\theta^{(t+1)})) \geqq ln(l(\theta^{t})) ln(l(θ(t+1)))ln(l(θt)),为递增,得证。

8)EM 算法之python 代码

# coding=utf-8
import numpy as np
import math

# 作者dls

# 生成样本
height_M = np.random.normal(loc=1.75, scale=0.07, size=17)  # 正态分布,男生
height_F = np.random.normal(loc=1.62, scale=0.07, size=12)  # 正态分布,女生
dataset = arr4 = np.concatenate((height_F, height_M), axis=0)

# print(dataset)
# 初始化
gamma = [0.5, 0.5]  # 男女概率p(z|θ)
theta = [1.70, 0.01, 1.62, 0.01]  # 男女分布参数


# part_M = []  # 初始化每个人男的比例
# part_F = []  # 初始化每个人女的比例


# 密度分布函数
def normal_distribution(x, mean, sigma):
    return np.exp(-1 * ((x - mean) ** 2) / (2 * (sigma ** 2))) / (math.sqrt(2 * np.pi) * sigma)


# 更新男女分布
def update_Q(dataset, theta, gamma):
    part_M = []
    part_F = []
    for data in dataset:
        dis_M = normal_distribution(data, theta[0], theta[1])
        dis_F = normal_distribution(data, theta[2], theta[3])
        part_M_data = dis_M * gamma[0] / (dis_M * gamma[0] + dis_F * gamma[1])
        part_M.append(part_M_data)
        part_F.append(1 - part_M_data)
    gamma[0] = np.sum(part_M)
    gamma[1] = np.sum(part_F)
    return part_M, part_F, gamma


# 更新平均值
def update_mean(dataset, part):
    sum_total = 0
    sum_count = 0
    for i in range(len(part)):
        sum_total = sum_total + part[i] * dataset[i]
        sum_count = sum_count + part[i]
    return sum_total / sum_count


# 更新sigma
def update_sigma(dataset, part, u):
    sum_total = 0
    sum_count = 0
    for i in range(len(part)):
        sum_total = sum_total + part[i] * (dataset[i] - u) * (dataset[i] - u)
        sum_count = sum_count + part[i]
    return math.sqrt(sum_total / sum_count)


part_M, part_F, gamma = update_Q(dataset, theta, gamma)
# print("男的权重",part_M)

theta[0] = update_mean(dataset, part_M)
theta[1] = update_sigma(dataset, part_M, theta[0])
theta[2] = update_mean(dataset, part_F)
theta[3] = update_sigma(dataset, part_M, theta[2])

for i in range(20):
    # E 步骤
    part_M, part_F, gamma = update_Q(dataset, theta, gamma)
    # print("男的权重",part_M)

    # M 步骤
    theta[0] = update_mean(dataset, part_M)
    theta[1] = update_sigma(dataset, part_M, theta[0])
    theta[2] = update_mean(dataset, part_F)
    theta[3] = update_sigma(dataset, part_M, theta[2])
    print("开始次数", i + 1)
    print("男女概率", gamma)
    print("分布参数", theta)
    print("*" * 80)
    print()
# print(gamma)

在这里插入图片描述
误差比较小。

9)EM 算法之感谢
简博士 大神 女神 的视频,收益匪浅!
https://www.bilibili.com/video/BV1No4y1o7ac/?spm_id_from=333.999.0.0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值