介绍摘自李航《统计学习方法》

EM算法

EM算法是一种迭代算法,1977年由Dempster等人总结提出,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计。EM算法的每次迭代由两步组成:E步,求期望(expectation);M步,求极大(maximization)。所以这一算法称为期望极大算法(expectation maximization algorithm),简称EM算法。本章首先叙述EM算法,然后讨论EM算法的收敛性;作为EM算法的应用,介绍高斯混合模型的学习;最后叙述EM算法的推广——GEM算法。

将观测数据表示为Y=(Y1,Y2,…,Yn)T,未观测数据表示为Z=(Z1,Z2,…,Zn)T,则观测数据的似然函数为

考虑求模型参数=(Π,p,q)的极大似然估计,即

这个问题没有解析解,只有通过迭代的方法求解。EM算法就是可以用于求解这个问题的一种迭代算法。下面给出针对以上问题的EM算法,其推导过程省略。

EM算法首先选取参数的初值,记作(0)=(Π(0),p(0),q(0)),然后通过下面的步骤迭代计算参数的估计值,直至收敛为止。第i次迭代参数的估计值为(i)=((i),p(i),q(i))。EM算法的第i+1次迭代如下。

E步:计算在模型参数Π(i),p(i),q(i)下观测数据yj来自掷硬币B的概率

M步:计算模型参数的新估计值

EM算法在高斯混合模型学习中的应用

EM算法的一个重要应用是高斯混合模型的参数估计。高斯混合模型应用广泛,在许多情况下,EM算法是学习高斯混合模型(Gaussian misture model)的有效方法。

定义9.2(高斯混合模型) 高斯混合模型是指具有如下形式的概率分布模型:

高斯混合模型参数估计的EM算法

1.明确隐变量,写出完全数据的对数似然函数

可以设想观测数据yj,j=1,2,…,N,是这样产生的:首先依概率ak选择第k个高斯分布分模型Ø(y|θk);然后依第k个分模型的概率分布Ø(y|θk)生成观测数据yj。这时观测数据yj,j=1,2,…,N,是已知的;反映观测数据yj来自第k个分模型的数据是未知的,k=1,2,…,K,以隐变量γjk表示,其定义如下:

有了观测数据yj及未观测数据γjk,那么完全数据是

于是,可以写出完全数据的似然函数:

2.EM算法的E步:确定Q函数

3.确定EM算法的M步

迭代的M步是求函数Q(θ,θ(i))对的极大值,即求新一轮迭代的模型参数:

重复以上计算,直到对数似然函数值不再有明显的变化为止。

 # coding:utf-8
import numpy as np def qq(y,alpha,mu,sigma,K,gama):#计算Q函数
gsum=[]
n=len(y)
for k in range(K):
gsum.append(np.sum([gama[j,k] for j in range(n)]))
return np.sum([g*np.log(ak) for g,ak in zip(gsum,alpha)])+\
np.sum([[np.sum(gama[j,k]*(np.log(1/np.sqrt(2*np.pi))-np.log(np.sqrt(sigma[k]))-1/2/sigma[k]*(y[j]-mu[k])**2))
for j in range(n)] for k in range(K)]) #《统计学习方法》中公式9.29有误 def phi(mu,sigma,y): #计算phi
return 1/(np.sqrt(2*np.pi*sigma)*np.exp(-(y-mu)**2/2/sigma)) def gama(alpha,mu,sigma,i,k): #计算gama
sumak=np.sum([[a*phi(m,s,i)] for a,m,s in zip(alpha,mu,sigma)])
return alpha[k]*phi(mu[k],sigma[k],i)/sumak def dataN(length,k):#生成数据
y=[np.random.normal(5*j,j+5,length/k) for j in range(k)]
return y def EM(y,K,iter=1000): #EM算法
n = len(y)
sigma=[10]*K
mu=range(K)
alpha=np.ones(K)
qqold,qqnew=0,0
for it in range(iter):
gama2=np.ones((n,K))
for k in range(K):
for i in range(n):
gama2[i,k]=gama(alpha,mu,sigma,y[i],k)
for k in range(K):
sum_gama=np.sum([gama2[j,k] for j in range(n)])
mu[k]=np.sum([gama2[j,k]*y[j] for j in range(n)])/sum_gama
sigma[k]=np.sum([gama2[j,k]*(y[j]-mu[k])**2 for j in range(n)])/sum_gama
alpha[k]=sum_gama/n
qqnew=qq(y,alpha,mu,sigma,K,gama2)
if abs(qqold-qqnew)<0.000001:
break
qqold=qqnew
return alpha,mu,sigma N = 500
k=2
data=dataN(N,k)
y=np.reshape(data,(1,N))
a,b,c = EM(y[0], k)
print a,b,c
# iter=180
#[ 0.57217609 0.42782391] [4.1472879054766887, 0.72534713118155769] [44.114682884921415, 24.676116557533351] sigma = 6 #网上的数据
miu1 = 40
miu2 = 20
X = np.zeros((1, N))
for i in xrange(N):
if np.random.random() > 0.5:
X[0, i] = np.random.randn() * sigma + miu1
else:
X[0, i] = np.random.randn() * sigma + miu2
a,b,c = EM(X[0], k)
print a,b,c
# iter=114
#[ 0.44935959 0.55064041] [40.561782615819361, 21.444533254494189] [33.374144230703514, 51.459622219329155]

高斯混合模型参数估计的EM算法的更多相关文章

  1. 高斯混合模型GMM与EM算法的Python实现

    GMM与EM算法的Python实现 高斯混合模型(GMM)是一种常用的聚类模型,通常我们利用最大期望算法(EM)对高斯混合模型中的参数进行估计. 1. 高斯混合模型(Gaussian Mixture ...

  2. 高斯混合模型和EM算法

    使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类别标签用表示.与k- ...

  3. 聚类之高斯混合模型与EM算法

    一.高斯混合模型概述 1.公式 高斯混合模型是指具有如下形式的概率分布模型: 其中,αk≥0,且∑αk=1,是每一个高斯分布的权重.Ø(y|θk)是第k个高斯分布的概率密度,被称为第k个分模型,参数为 ...

  4. 学习笔记——EM算法

    EM算法是一种迭代算法,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计.EM算法的每次迭代由两步组成:E步,求期望(expectation):M步,求 ...

  5. Python实现机器学习算法:EM算法

    ''' 数据集:伪造数据集(两个高斯分布混合) 数据集长度:1000 ------------------------------ 运行结果: ---------------------------- ...

  6. EM算法及其推广

    概述 EM算法是一种迭代算法,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计. EM算法的每次迭代由两步组成:E步,求期望(expectation): ...

  7. 《统计学习方法》笔记九 EM算法及其推广

    本系列笔记内容参考来源为李航<统计学习方法> EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计或极大后验概率估计.迭代由 (1)E步:求期望 (2)M步:求极大 组成,称 ...

  8. EM算法及其应用: K-means 与 高斯混合模型

    EM算法及其应用(一) EM算法及其应用(二): K-means 与 高斯混合模型 上一篇阐述了EM算法的主要原理,这一篇来看其两大应用 -- K-means 与 高斯混合模型,主要由EM算法的观点出 ...

  9. 5. EM算法-高斯混合模型GMM+Lasso

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-GMM代码实现 5. EM算法-高斯混合模型+Lasso 1. 前言 前面几篇博文对EM算法和G ...

随机推荐

  1. php中常用的运算符

    运算符 运算符是告诉PHP做相关运算的标识符号. PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. 1.变量名记得加“$” 符: 2. ...

  2. for循环进阶

    [引例] 输出一行10个“*” #include<cstdio> int main(){ printf("**********\n"); ; } 思考: (1)输出一行 ...

  3. PAT 08-2 求矩阵的局部最大值

    这题挺简单的,但,每日一篇.说两点:第一,我的粗心导致我这题花了大把的时间去找错误,看到4个测试用例对了三个,我以为是那块的边界条件没考虑到,又或者是存在隐蔽的逻辑或语法错误,通过与别人程序的反复对比 ...

  4. UIImageView异步加载网络图片

    在iOS开发过程中,经常会遇到使用UIImageView展现来自网络的图片的情况,最简单的做法如下: 去下载https://github.com/rs/SDWebImage放进你的工程里,加入头文件# ...

  5. HTML中的鼠标光标属性

    在网页中默认的鼠标指针只有两种,一种是最普通的箭头,另一种是当移动到链接上时出现的“小手”.但现在越来越多的网页都使用了CSS鼠标指针技术,当将鼠标移动到链接上时,可以看到多种不同的效果.CSS可以通 ...

  6. YII2.0中实现高级注册

    如何在不修改逻辑代码的情况下完美解决以上三个问题?看了下面的教程,一目了然! 以高级版2.0.6为例,打开/frontend/models/SignupForm.php class SignupFor ...

  7. java作业6

    super用法: 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Base() { System.out.println(" ...

  8. Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)

     Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二) 附录文章4简单介绍了如何启动一个后台线程任务,Android Priority J ...

  9. .NET 代码编译过程

    作为一种代码指令平台,Microsoft .NET比微软公司先前推出的其他技术平台要来得更为复杂.由于.NET提供了对多种编程语言以及(在理论上说)多重平台的支持,这就需要在传统的两个代 码层添加一个 ...

  10. 十 SSH

    一 Struts 1. 定义:该框架使用 MVC 设计模式开发程序 2. 框架概览: 二 Hibernate 1. 作用:提供了利用面向对象的思想来操作关系型数据的接口 2. 框架图示: 三 Spri ...