从 GMM 到 EM 算法
2016-01-07 09:01
267 查看
首先需要声明的是,GMM是Gaussian Mixture Model,混合高斯模型,是一个模型。EM算法,Expection Maximization期望最大是一套计算框架(framework),一系列的计算流程(迭代式的)。一般地,我们可以使用EM算法来求解GMM问题,即 put GMM into EM framework。
EM迭代流程为:
θ(g+1)=argmaxθM-Step∫zlogp(X,z|θ)p(z|X,θ(g))dzE-Step
X={x1,x2,…,xN}
其 joint density 或者叫 log joint density:
logP(X)=∑i=1Nlog∑ℓ=1kαkN(xi|μℓ,σℓ)
混合高斯模型(GMM)参数集 Θ={μ1,…,μk,Σ1,…,Σk,α1,…,αk−1}
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,Θ)⇓(大名鼎鼎的EM期望最大算法)Ep(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))dzQ(Θ,Θ(g))−∫zlogp(z|X,Θ)p(z|X,Θ)dzH(Θ,Θ(g))⇓logp(X|Θ)=Q(Θ,Θ(g))−H(Θ,Θ(g))
Θ(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=1N∑zi=1k(logαℓ+logN(xi|μℓ,Σℓ))p(ℓ|xi,Θ(g))=∑i=1N∑ℓ=1k(logαℓ+logN(xi|μℓ,Σℓ))p(ℓ|xi,Θ(g))
M-Step:
⇒αℓ=1N∑i=1Np(ℓ|xi,Θ(g))
EM迭代流程为:
θ(g+1)=argmaxθM-Step∫zlogp(X,z|θ)p(z|X,θ(g))dzE-Step
X={x1,x2,…,xN}
其 joint density 或者叫 log joint density:
logP(X)=∑i=1Nlog∑ℓ=1kαkN(xi|μℓ,σℓ)
混合高斯模型(GMM)参数集 Θ={μ1,…,μk,Σ1,…,Σk,α1,…,αk−1}
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,Θ)⇓(大名鼎鼎的EM期望最大算法)Ep(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))dzQ(Θ,Θ(g))−∫zlogp(z|X,Θ)p(z|X,Θ)dzH(Θ,Θ(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=1N∑zi=1k(logαℓ+logN(xi|μℓ,Σℓ))p(ℓ|xi,Θ(g))=∑i=1N∑ℓ=1k(logαℓ+logN(xi|μℓ,Σℓ))p(ℓ|xi,Θ(g))
M-Step:
⇒αℓ=1N∑i=1Np(ℓ|xi,Θ(g))
补充
GMM问题求解的困难在于,L(Θ|X)=∑Ni=1log∑kℓ=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)
相关文章推荐
- jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
- java160104PackageDemo
- Andorid中.9.png图片的使用及制作
- 这四种加薪理由,肯定没戏!
- StreamCQL源码阅读(1) 提交任务
- 安装scrapy时遇到的一个错误
- C#之浏览器请求跨域
- java160104DemoA
- DOM解析XML
- 在oc语言中字符串和整型数相互转换
- C#连接Mysql数据库,sql语句正确但是抛出异常。。
- python之路--线程和进程
- java160104DemoB
- java160104DemoC
- 2015年1月6日回顾
- moc文件 如何生成的
- 练习Andorid中.9.png图片的制作及使用
- Andorid中.9.png图片的使用及制作
- 怎么使用jquery判断一个元素是否含有一个指定的类(class)另外如何给元素动态添加类
- Android编程实现读取本地SD卡图片的方法