从 GMM 到 EM 算法

121 篇文章 39 订阅

首先需要声明的是,GMM是Gaussian Mixture Model,混合高斯模型,是一个模型。EM算法,Expection Maximization期望最大是一套计算框架(framework),一系列的计算流程(迭代式的)。一般地,我们可以使用EM算法来求解GMM问题,即 put GMM into EM framework

EM迭代流程为:

θ(g+1)=argmaxθM-Stepzlogp(X,z|θ)p(z|X,θ(g))dzE-Step

X={x1,x2,,xN}
joint density 或者叫 log joint density

logP(X)=i=1Nlog=1kαkN(xi|μ,σ)

混合高斯模型(GMM)参数集 Θ={μ1,,μk,Σ1,,Σk,α1,,αk1}

P(xi|Θ)==1kαN(xi|μ,Σ)

ΘMLE=argmaxΘi=1Nlog=1kαN(xi|μ,Σ)

其中 L(Θ|X)=i=1Nlog=1kαN(xi|μ,Σ) ,混合的情形下,不再像单高斯(single mode Gaussian)的情况,不存在一个显示的解析解,一种常规的替代方案是使用迭代的方式去寻找(像MCMC算法那样,收敛到稳态?:-D),而这一方式正是著名的EM算法。

所谓迭代的方式即是提供如下的一种递归关系:

Θ(g+1)=f(Θ(g))

EM算法给出的 f() 是:

Θ(g+1)=argmaxΘzP(X,z|Θ)P(z|X,Θ(g))dz

该递推关系还应至少满足, logP(X|Θ(g+1))>logP(X|Θ(g)) (Log Likelihood)

其中引变量 zi zi={1,,k} ) 标识样本 xi 所属的高斯号(哪一个高斯),这样就将GMM的fitting问题转换为了single mode Gauss的fitting问题了(将每个高斯对应的数据摘出来)。引变量的存在使得问题得以简化对所添加的隐藏变量的要求是不能改变边缘分布(marginal distribution):

p(xi)=zip(xi|zi)N(xi|μzi,Σzi)p(zi)αzidzi

又因为 zi 是离散型随机变量,取值为 zi={1,,k} ,又可将积分符号改造为求和符号。也即:

p(xi)=zi=1kp(xi|zi)p(zi)=zi=1kαziN(xi|μzi,Σzi)

此时关于 xi 的边缘分布,刚好就是 L(Θ|X)=i=1Nlog=1kαN(xi|μ,Σ)

也即添加引变量之后并未改变数据的边缘分布。

logp(X|Θ)=logp(X,z|Θ)logp(z|X,Θ)EMEp(z|X,Θ(g))[logp(X|Θ)]=Ep(z|X,Θ(g))[logp(X,z|Θ)]Ep(z|X,Θ(g))[logp(z|X,Θ)]logp(X|Θ)=zlogp(X,z|Θ)p(z|X,Θ(g))dzQ(Θ,Θ(g))zlogp(z|X,Θ)p(z|X,Θ)dzH(Θ,Θ(g))logp(X|Θ)=Q(Θ,Θ(g))H(Θ,Θ(g))

put GMM into EM framework

EM framework:

Θ(g+1)=argmaxΘzlogp(X,Z|Θ)p(Z|X,Θ(g))dz

  • 如何定义 p(X,Z|Θ) zi 是对高斯的指定):

p(X,Z|Θ)=i=1Np(xi,zi|Θ)=i=1Np(xi|zi,Θ)N(μzi,Σzi)p(zi|Θ)αzi=i=1NαziN(μzi,Σzi)

还记得 p(X|Θ) 的形式吗?

p(X|Θ)==1kαN(X|μ,σ)=i=1N=1kαN(xi|μ,σ)

可见 p(X,Z|Θ) p(X|Θ) 关于高斯的指定。

  • 再来看 p(Z|X,Θ) 的定义

因为 (xi,zi) 彼此独立:

p(Z|X,Θ)=i=1Np(zi|xi,Θ)=i=1Np(zi)p(xi|zi)zip(zi)p(xi|zi)=αziN(xi|μzi,Σzi)αziN(xi|μzi,Σzi)

代入到EM的框架下:

E-Step:

=i=1Nzi=1k(logα+logN(xi|μ,Σ))p(|xi,Θ(g))=i=1N=1k(logα+logN(xi|μ,Σ))p(|xi,Θ(g))

M-Step:
α=1Ni=1Np(|xi,Θ(g))

补充

GMM问题求解的困难在于, L(Θ|X)=Ni=1logk=1αN(xi|μ,Σ) 对和式求对数。(numpy提供了np.logaddexp(),:-D)

>>> import numpy as np
>>> np.logaddexp(np.log(1), np.log(1))
0.69314718055994529
                            # np.logaddexp(x, y) = log(e^x+e^y)
>>> np.log(1+1)
0.69314718055994529
                            # np.logaddexp(log(x), log(y)) = log(x+y)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值