首先需要声明的是,GMM是Gaussian Mixture Model,混合高斯模型,是一个模型。EM算法,Expection Maximization期望最大是一套计算框架(framework),一系列的计算流程(迭代式的)。一般地,我们可以使用EM算法来求解GMM问题,即 put GMM into EM framework。
EM迭代流程为:
X={x1,x2,…,xN}
其 joint density 或者叫 log joint density:
混合高斯模型(GMM)参数集
Θ={μ1,…,μk,Σ1,…,Σk,α1,…,αk−1}
其中 L(Θ|X)=∑i=1Nlog∑ℓ=1kαℓN(xi|μℓ,Σℓ) ,混合的情形下,不再像单高斯(single mode Gaussian)的情况,不存在一个显示的解析解,一种常规的替代方案是使用迭代的方式去寻找(像MCMC算法那样,收敛到稳态?:-D),而这一方式正是著名的EM算法。
所谓迭代的方式即是提供如下的一种递归关系:
EM算法给出的
f(⋅)
是:
该递推关系还应至少满足, logP(X|Θ(g+1))>logP(X|Θ(g)) (Log Likelihood)
其中引变量
zi
(
zi={1,…,k}
) 标识样本
xi
所属的高斯号(哪一个高斯),这样就将GMM的fitting问题转换为了single mode Gauss的fitting问题了(将每个高斯对应的数据摘出来)。引变量的存在使得问题得以简化。对所添加的隐藏变量的要求是不能改变边缘分布(marginal distribution):
又因为
zi
是离散型随机变量,取值为
zi={1,…,k}
,又可将积分符号改造为求和符号。也即:
此时关于 xi 的边缘分布,刚好就是 L(Θ|X)=∑i=1Nlog∑ℓ=1kαℓN(xi|μℓ,Σℓ)
也即添加引变量之后并未改变数据的边缘分布。
put GMM into EM framework
EM framework:
- 如何定义 p(X,Z|Θ) ( zi 是对高斯的指定):
还记得
p(X|Θ)
的形式吗?
可见 p(X,Z|Θ) 是 p(X|Θ) 关于高斯的指定。
- 再来看 p(Z|X,Θ) 的定义
因为
(xi,zi)
彼此独立:
代入到EM的框架下:
E-Step:
M-Step:
补充
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)