EM(expectationmaximization algorithm)算法是一种迭代算法,1977年由Dempster等人总结提出,
用于含有隐变量的概率模型参数的极大似然估计,或极大后验概率估计。EM算法的每次迭代由两步组成:E步,求期望;M步,求极大,所以这一算法称为期望极大算法,简称EM算法。
一、EM算法的推导
用X=(x1,x2,…,xn)表示观测数据,H=(h1,h2,…,hn)表示隐变量数据,隐变量数据hi都服从隐变量分布Z(z1,z2,…,zn),即为隐变量数据的全部取值集合,那么,X与Z一起成为完全数据。观测数据可以直接获得并使用,但是隐变量取值并不明确,所以要根据观测数据的对数似然函数极大化来求得最优参数。
1.E步
当且仅当xi为常数时等号成立。如果f(x)是凸函数则不等号反向。
如果f(x)为凹函数时,将xi看作是随机变量X得取值,将λi看作随机变量取值xi得概率,则E[f(x)]大于等于
f[E(x)],当且仅当随机变量X是常数时等号成立。当f(x)是凸函数时不等号反向。
将Jensen不等式应用于对数似然函数,构造λi。
因为Jensen不等式成立有如下约束条件:
且要使等号成立则必须有:
所以:
由此看出,高斯混合模型混合的基本分布就是高斯分布。
假设观测数据x1,x2,…,xN由高斯混合模型生成,其中,θ=(α1,α2,…,αk;θ1,θ2,…,θk),下面用EM算法估计高斯混合模型的参数θ。
1. 明确隐变量与完全数据的对数似然函数
设想观测数据xj,j=1,2,…,N是这样产生的:首先依概率αk选择第k个高斯分布分模型Φ(x|θk),然后依第k个分模型的概率分布Φ(x|θk)生成观测数据xj。这时的观测数据是已知的;但是反应观测数据xj来自第k个分模型的数据是未知的,以隐变量γjk表示,其定义为:
γjk是0-1随机变量。有了观测数据与未观测数据,那么完全数据是(xj,γj1,γj2,…,γjk),j=1,2,…,N。于是,可以得到完全数据的似然函数:
2.EM算法的E步—确定Q函数
是当前模型参数下第j个观测数据来自第k个分模型的概率,称为分模型k对观测数据xj的响应度。
3. 确定EM算法的M步
四、高斯混合模型参数估计的EM算法
输入:观测数据xj,j=1,2,…,N与高斯混合模型。
输出:高斯混合模型参数。
(1)取参数的初始值开始迭代。
(2)E步:依据当前模型参数,计算分模型k对观测数据xj的响应度:
(1)计算观测数据的似然函数
(2)计算对数似然函数
![e6f32248923f4ef743ded88e2d26cc0b.png](https://i-blog.csdnimg.cn/blog_migrate/4dbb48daca4f247fb80e510dc72225db.png)
![df338b9939da65a9aac52d9eb8579ec0.png](https://i-blog.csdnimg.cn/blog_migrate/27b0036288f611fd0bef3155e790933b.png)
![09ab2731b890894788e2e5b4671ec4ba.png](https://i-blog.csdnimg.cn/blog_migrate/9106a83ce261324ade2b1286a266b3d7.png)
![a26f8fa535d99d79386268fb74a54d09.png](https://i-blog.csdnimg.cn/blog_migrate/5bf2112bf9e16587dc0a02f77d0b609f.png)
![dcc769e54ffd547a58eed0ea15065261.png](https://i-blog.csdnimg.cn/blog_migrate/c9a88e204a7f8b6a3c6f4fdcbc34c82c.png)
![b17ab2878dc29e5f21d9baf0e0676fd1.png](https://i-blog.csdnimg.cn/blog_migrate/c01bb4a0b6d64bd14e4051b4643d291d.png)
2.M步
![100695a66f811211a8acb6de86965f26.png](https://i-blog.csdnimg.cn/blog_migrate/2d74278cee26877779ec8ce704f67629.png)
三、EM算法在高斯混合模型学习中的应用
EM算法的一个重要应用是高斯混合模型的参数估计。高斯混合模型(Gaussian Mixed Model,GMM)是一种常见的聚类算法,在图像分割、对象识别、视频分析等方面均有应用,对于任意给定的数据样本集合,根据其分布概率,可以计算每个样本数据向量的概率分布,从而根据概率分布对其进行分类。高斯混合模型是指具有如下形式的概率分布模型:
![5dde45aa83036f5a5c0130e36d63e1e6.png](https://i-blog.csdnimg.cn/blog_migrate/abb5cf86ae2c2b2953de6938d2eefc90.png)
![89ab35c2e5a6ee6827d519cc266df953.png](https://i-blog.csdnimg.cn/blog_migrate/cdd373d67f3636195a7e4019c991c109.png)
![1e4843550ced9ba5f3529aee9ef01974.png](https://i-blog.csdnimg.cn/blog_migrate/9038ce9499152b9b740cf42ff830aac6.png)
进一步得到完全数据的对数似然函数:
![3ea17003bf8ebd80cc330f7b4e5ec536.png](https://i-blog.csdnimg.cn/blog_migrate/722eaac9e1da3e21b82fb7bb7a370ec7.png)
![e517e54b235733eb09bfa2f1cc37363a.png](https://i-blog.csdnimg.cn/blog_migrate/8f2f7e4bafaff2ba8eb2ac18c55ac3e5.png)
![e65f9fe54cd0b75143a62fd5a3188523.png](https://i-blog.csdnimg.cn/blog_migrate/7522576e3fe4be6ba69ffca79632e12a.png)
![590f2def213a6b5f899d12e396f04e58.png](https://i-blog.csdnimg.cn/blog_migrate/fedb54c1a5d08e0c98a60e6a2f250903.png)
![2b74c7d9f6cceb7ce8aee031da73bb44.png](https://i-blog.csdnimg.cn/blog_migrate/2060fbb96d944964fc6c721abee13e66.png)
import numpy as npfrom scipy.stats import normy = np.array([-67, -48, 6, 8, 14, 16, 23, 24, 28, 29, 41, 49, 56, 60, 75])K = 2 # 两个高斯N = 15 # y有15个数据# 参数初始化mu = np.array([0.5, 0.5])sigma = np.array([1.0, 1.0]) * 10alpha = np.array([0.5, 0.5])for i in range(10): gm = np.zeros((N, K)) # E 步 for j in range(N): for k in range(K): gm[j, k] = alpha[k] * norm(mu[k], sigma[k]).pdf(y[j]) #使用scipy实现高斯分布 gm[j, :] /= sum(gm[j, :]) # gm[j,:] = gm[j,:] /sum(gm[j,:]) # M 步 mu2 = y.dot(gm) / sum(gm) alpha2 = sum(gm) / N sigma2 = np.zeros((2,)) sigma2[0] = sum(gm[:, 0] * (y - mu[0]) ** 2) / sum(gm[:, 0]) sigma2[1] = sum(gm[:, 1] * (y - mu[1]) ** 2) / sum(gm[:, 1]) #判断是否收敛 if sum((mu - mu2) ** 2 + (sigma - sigma2) ** 2 + (alpha - alpha2) ** 2) < 0.01: break mu = mu2 sigma = sigma2 alpha = alpha2 print("第%d次迭代\nalpha_0=%f,mu_0=%f,sigma_0=%f\nalpha_1=%f,mu_1=%f,sigma_1=%f\n" %(i+1, alpha[0], mu[0], sigma[0], alpha[1], mu[1], sigma[1]))