注:本文是对《统计学习方法》EM算法的一个简单总结。

1. 什么是EM算法?

引用书上的话:

概率模型有时既含有观测变量,又含有隐变量或者潜在变量。如果概率模型的变量都是观测变量,可以直接使用极大似然估计法或者贝叶斯的方法进行估计模型参数,但是当模型含有隐藏变量时,就不能简单使用这些方法了。EM算法就是含有隐变量的概率模型参数的极大似然估计法,或者极大似然后验概率估计法。

2. EM 算法的一个小例子:三硬币模型

假设有3枚硬币,记作A,B,C。这些硬币的正面出现的概率分别为\(\pi\)、\(p\)、\(q\)。进行如下的试验:先掷硬币A,根据A的结果选择B和C,如果掷A得到正面,则选择B;如果掷A得到反面,则选择C。接着掷出选出的硬币。记录下这次掷硬币的结果,如果是正面,则记作1,反面则记作0。独立重复做了n次试验(这里取n=10),得到结果如下:1,1,0,1,0,0,1,0,1,1。假设只能观测到抛硬币的结果,不能观测到抛硬币的过程,那么我们该如何估计三硬币的参数\(\pi\)、\(p\)、\(q\)呢?(也就是估计三枚硬币正面向上的概率)
  EM算法分为E步和M步。EM 算法首先选取了参数的初始值,记作\(\theta^{(0)}\)=(\(\pi^{(0)}\),\(p^{(0)}\),\(q^{(0)}\))。然后通过下面的步骤迭代计算参数的估计值,直到收敛为止,第\(i\)次迭代的参数的估计值记作\(\theta^{(i)}\)=(\(\pi^{(i)}\),\(p^{(i)}\),\(q^{(i)}\)),则EM算法的第\(i+1\)次迭代为:
  E步:计算模型在参数\(\pi^{(i)}\)、\(p^{(i)}\)、\(q^{(i)}\)下观测数据\(y_j\)来自掷硬币B的概率为
\(\mu_j^{(i+1)}\) = \(\frac{\pi^{(i)}(p^{(i)})^{y_j}(1-p^{(i)})^{1-y_j}}{\pi^{(i)}(p^{(i)})^{y_j}(1-p^{(i)})^{1-y_j} + (1-\pi^{(i)})(q^{(i)})^{y_j}(1-q^{(i)})^{1-y_j}}\)
  M步:计算模型新的参数的估计值:
\(\pi^{(i+1)}=\frac{1}{n}\sum_{j=1}^{n}\mu_j^{(i+1)}\)
\(p^{(i+1)}=\frac{\sum_{j=1}^{n}\mu_j^{(i+1)}y_j}{\sum_{j=1}^{n}\mu_j^{(i+1)}}\)
\(q^{(i+1)}=\frac{\sum_{j=1}^{n}(1-\mu_j^{(i+1)})y_j}{\sum_{j=1}^{n}(1-\mu_j^{(i+1)})}\)

下面带入具体的数字计算一下。如果模型的初始参数取值为:\(\pi{(0)}=0.5,p^{(0)}=0.5,q^{(0)}=0.5\)
那么带入上面的三个公式就可以计算出:\(\pi{(1)}=0.5,p^{(1)}=0.6,q^{(1)}=0.6\),继续迭代可以得到 \(\pi{(2)}=0.5,p^{(2)}=0.6,q^{(2)}=0.6\)。于是我们可以得到原来参数\(\theta\)的极大似然估计为:\(\hat{\pi}=0.5,\hat{p}=0.6,\hat{q}=0.6\)。
如果取初值改为 \(\pi{(0)}=0.4,p^{(0)}=0.6,q^{(0)}=0.7\),那么我们可以计算出:\(\mu_1^{(1)}=\frac{0.4\times0.6}{0.4\times0.6+0.6\times0.7}=0.364\)
:\(\mu_0^{(1)}=\frac{0.4\times0.4}{0.4\times0.4+0.6\times0.3}=0.47\)
那么由于观测值中1出现了6次,0出现了4次,于是我们容易计算出:
\(\pi^{(1)}=\frac{0.364\times6+0.47\times4}{10}=0.4064\)
\(p^{(1)}=\frac{0.364\times1\times6+0.47\times0\times4}{0.364\times6+0.47\times4}=0.537\)
\(q^{(1)}=\frac{(1-0.364)\times6}{(1-0.364)\times6+(1-0.47)\times4}=0.643\)
显然,我们由于初始值选择的不同,导致了模型参数最终估计的不同,这说明了EM算法对于参数的初始值是非常敏感的。

3 EM 算法的步骤

输入:观测变量数据\(Y\),隐变量数据\(Z\),联合分布\(P(Y,Z|\theta)\),条件分布\(P(Z|Y,\theta)\);
输出:模型参数\(\theta\)。

(1) 选择模型参数的初值\(\theta^{(0)}\),开始迭代;
(2)\(E\)步:记\(\theta^{(i)}\)为第\(i\)次迭代参数\(\theta\)的估计值,在第\(i+1\)次迭代的E步,计算
\(Q(\theta,\theta^{(i)}=E_Z[logP(Y,Z|\theta)|Y,\theta^{(i)}]=\sum_{Z}logP(Y,Z|\theta)P(Z|Y,\theta^{(i)})\)
这里\(P(Z|Y,\theta^{(i)})\)是在给定观测数据Y和当前参数估计的\(\theta^{(i)}\)下隐变量数据\(Z\)的条件概率分布;
(3)\(M\)步:求使得\(Q(\theta,\theta^{(i)})\)极大化的\(\theta\),确定第\(i+1\)次迭代的参数的估计值\(\theta^{(i+1)}\)
\(\theta^{(i+1)}=arg max_{\theta}Q(\theta,\theta^{(i)})\)
(4)重复第(2)步和第(3)步,直到算法收敛。
上面定义的函数\(Q(\theta,\theta^{(i)})\)是EM算法的核心,称为Q函数(Q function)。下面给出Q函数的定义:
(Q函数) 完全数据的对数似然函数\(logP(Y,Z|\theta)\)关于给定观测数据\(Y\)和当前参数\(\theta^{(i)}\)下对未观测数据\(Z\)的条件概率分布\(P(Z|Y,\theta^{(i)})\)的期望称为\(Q\)函数,即:
\(Q(\theta,\theta^{(i)}=E_Z[logP(Y,Z|\theta)|Y,\theta^{(i)}]\)

4. EM算法的收敛性

1. 设\(P(Y|\theta)\)为观测数据的似然函数,\(\theta^{(i)}(i=1,2,...)\)为EM算法得到的参数估计序列,\(P(Y|\theta^{(i)}\)为对应的似然函数序列,则\(P(Y|\theta^{(i)}\)是单调递增的,即:

\(P(Y|\theta^{(i+1)} \ge P(Y|\theta^{(i)})\)。

2. 设 \(L(\theta)=logP(Y|\theta)\)为观测数据的对数似然函数,\(\theta^{(i)}\)为EM算法得到的参数估计序列,\(L(\theta^{(i)})\)为对应的对数似然函数序列,则

(1) 如果\(P(Y|\theta)\)有上界,则\(L(\theta^{(i)})=logP(Y|\theta^{(i)})\)收敛到某一值\(L^{*}\);

(2) 在函数 \(Q(\theta,\theta^{'})\)与\(L(\theta)\)满足一定的条件下,由EM算法得到的参数估计序列\(\theta^{(i)}\)的收敛值\(\theta^{*}\)是\(L(\theta)\)的稳定点。

5. 高斯混合模型(GMM)

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

\(P(Y|\theta)=\sum_{k=1}^{K}\alpha_k\phi(y|\theta_k)\)
其中\(\alpha_k\)是系数,\(\alpha_k \ge 0\),\(\sum_{k=1}^{K}\alpha_k=1\);\(\phi(y|\theta_k)\)是高斯分布(正态分布)密度函数,\(\theta_k=(\mu_k,\sigma_k^{2})\),
\(\phi(y|\theta_k)=\frac{1}{\sqrt(2\pi)\sigma_k}exp(-\frac{(y-\mu_k)^2}{2\sigma_k^2})\) 称为第\(k\)个分模型。

2. 使用EM算法估计高斯混合模型

具体推导过程从略,可以参见《统计学习方法》。这里直接给出结果:
高斯混合模型的EM估计算法
输入:观测数据\(y_1,y_2,...,y_N\),高斯混合模型;
输出:高斯混合模型的参数。
(1)取参数的初始值迭代
(2)E步,依据当前模型的参数,计算分模型k对观测数据\(y_j\)的响应度,
\(\hat\gamma_{jk}=\frac{\alpha_k\phi(y_j|\theta_k)}{\sum_{k=1}^{K}\alpha_k\phi(y_j|\theta_k)},j=1,2,...,N,k=1,2,...K\)
(3)计算新一轮迭代的模型参数
\(\hat\mu_k=\frac{\sum_{j=1}^{N}\hat\gamma_{jk}y_j}{\sum_{j=1}^{N}\hat\gamma_{jk}},k=1,2,...,K\)
\(\hat\sigma_k^2=\frac{\sum_{j=1}^{N}\hat\gamma_{jk}(y_j-\mu_k)^2}{\sum_{j=1}^{N}\hat\gamma_{jk}},k=1,2,...,K\)
\(\hat\alpha_k=\frac{\sum_{j=1}^{N}\hat\gamma_{jk}}{N},k=1,2,...,K\)
(4)重复(2)和(3)直到收敛。

6. python 实现 EM算法求解高斯混合模型

求解的步骤参考5,这里直接给出代码如下:

from __future__ import print_function
import numpy as npdef generateData(k,mu,sigma,dataNum):'''产生混合高斯模型的数据:param k: 比例系数:param mu: 均值:param sigma: 标准差:param dataNum:数据个数:return: 生成的数据'''# 初始化数据dataArray = np.zeros(dataNum,dtype=np.float32)# 逐个依据概率产生数据# 高斯分布个数n = len(k)for i in range(dataNum):# 产生[0,1]之间的随机数rand = np.random.random()Sum = 0index = 0while(index < n):Sum += k[index]if(rand < Sum):dataArray[i] = np.random.normal(mu[index],sigma[index])breakelse:index += 1return dataArraydef normPdf(x,mu,sigma):'''计算均值为mu,标准差为sigma的正态分布函数的密度函数值:param x: x值:param mu: 均值:param sigma: 标准差:return: x处的密度函数值'''return (1./np.sqrt(2*np.pi))*(np.exp(-(x-mu)**2/(2*sigma**2)))def em(dataArray,k,mu,sigma,step = 10):'''em算法估计高斯混合模型:param dataNum: 已知数据个数:param k: 每个高斯分布的估计系数:param mu: 每个高斯分布的估计均值:param sigma: 每个高斯分布的估计标准差:param step:迭代次数:return: em 估计迭代结束估计的参数值[k,mu,sigma]'''# 高斯分布个数n = len(k)# 数据个数dataNum = dataArray.size# 初始化gama数组gamaArray = np.zeros((n,dataNum))for s in range(step):for i in range(n):for j in range(dataNum):Sum = sum([k[t]*normPdf(dataArray[j],mu[t],sigma[t]) for t in range(n)])gamaArray[i][j] = k[i]*normPdf(dataArray[j],mu[i],sigma[i])/float(Sum)# 更新 mufor i in range(n):mu[i] = np.sum(gamaArray[i]*dataArray)/np.sum(gamaArray[i])# 更新 sigmafor i in range(n):sigma[i] = np.sqrt(np.sum(gamaArray[i]*(dataArray - mu[i])**2)/np.sum(gamaArray[i]))# 更新系数kfor i in range(n):k[i] = np.sum(gamaArray[i])/dataNumreturn [k,mu,sigma]if __name__ == '__main__':# 参数的准确值k = [0.3,0.4,0.3]mu = [2,4,3]sigma = [1,1,4]# 样本数dataNum = 5000# 产生数据dataArray = generateData(k,mu,sigma,dataNum)# 参数的初始值# 注意em算法对于参数的初始值是十分敏感的k0 = [0.3,0.3,0.4]mu0 = [1,2,2]sigma0 = [1,1,1]step = 6# 使用em算法估计参数k1,mu1,sigma1 = em(dataArray,k0,mu0,sigma0,step)# 输出参数的值print("参数实际值:")print("k:",k)print("mu:",mu)print("sigma:",sigma)print("参数估计值:")print("k1:",k1)print("mu1:",mu1)print("sigma1:",sigma1)

运行结果如下:

如果改变初始参数为:

k0=[0.1,0.4,0.5]
mu0=[3,3,2]
sigma0=[2,1,1.5]

那么得到的结果为:

  对比可以发现,两次参数估计的结果相差还是很大的。这也说明了EM算法对初始参数的敏感性。在实际应用的过程中,我们可以通过多次试验验证来选择估计结果最好的那个作为初始参数。

转载于:https://www.cnblogs.com/lyrichu/p/7814651.html

EM 算法求解高斯混合模型python实现相关推荐

  1. em算法python代码_EM 算法求解高斯混合模型python实现

    注:本文是对<统计学习方法>EM算法的一个简单总结. 1. 什么是EM算法? 引用书上的话: 概率模型有时既含有观测变量,又含有隐变量或者潜在变量.如果概率模型的变量都是观测变量,可以直接 ...

  2. 机器学习教程 之 EM算法 :高斯混合模型聚类算法 (python基于《统计学习方法》实现,附数据集和代码)

    之前写过一篇博客讲述极大似然方法, 这一方法通常适用于知道观测数据 Y Y Y,求解模型参数 θ \theta θ的场合,即 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ). 但是,在更 ...

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

    本篇文章是之前期望极大算法(EM算法)文章的后续,有需要可以先看看那篇文章关于EM算法的推导. 高斯混合模型 高斯混合模型是研究算法的人避不开的一个东西,其在非深度学习的远古时代经常被用到,比如图像处 ...

  4. 百面机器学习—7.K均值算法、EM算法与高斯混合模型要点总结

    文章目录 一.总结K均值算法步骤 二.如何合理选择K值? 三.K均值算法的优缺点是什么? 四.如何对K均值算法进行调优? 五.EM算法解决什么问题? 六.EM算法流程是什么? 六.EM算法能保证收敛嘛 ...

  5. 论文R语言复现 | 基于 EM 算法的高斯混合模型参数估计

    高斯混合概率在众多领域都有重要应用,依据已知观测数据估计高斯模型中未知参数就显得尤为重要,由于观测值具体来自于高斯分布的哪个分模型是未知的,那么利用传统的极大似然( MLE) 方法进行参数估计就变得十 ...

  6. EM算法及高斯混合模型GMM详述

    1.最大似然估计 最大似然估计(Maximum Likelihood Estimation,MLE)就是利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程.直白来讲,就是给定了 ...

  7. 采用EM算法对高斯混合模型(GMM)进行参数估计

    介绍一个EM算法的应用例子:高斯混合模型参数估计. 高斯混合模型 高斯混合模型(Gaussian Mixture Model, GMM)是由多个高斯分布组成的模型,其密度函数为多个高斯密度函数的加权组 ...

  8. 基于EM算法的高斯混合模型参数估计

    一 算法思想 对于样本数据集所含变量都是可观测的,我们一般应用极大似然估计法或者贝叶斯估计法估计模型参数.但若样本数据集中存在不可观测的变量(隐变量),那么单纯的极大似然估计法是不可用的:EM算法(e ...

  9. 混合高斯模型_EM算法求解高斯混合模型(GMM)

    单维的高斯模型: 求解一维的高斯模型参数时,我们可以使用最大似然法,其对数似然函数的表达式(log-likelyhood)如下: 对均值和方差求偏导可以求的高斯分布中的 在混合高斯模型中, 记 其对数 ...

  10. 机器学习最易懂之EM算法详解与python实现

    文章目录 0.前言 1.EM算法引入 2.具体的EM算法 3.EM算法推导 3.1 Jensen不等式 3.2 EM推导 3.3 EM算法的收敛性 4.EM算法在高斯混合模型中的应用 4.1 高斯混合 ...

最新文章

  1. 统计寄存器AX中1 的个数
  2. springmvc中@PathVariable和@RequestParam的区别
  3. BZOJ 2208[Jsoi2010]连通数
  4. android 变量Map集合
  5. Maximum Subarray leetcode java
  6. jq使用教程04_高校版教程
  7. gdb php-fpm,用gdb分析段错误(Segmentation fault)
  8. 戴尔软件部门第一弹 收购备份公司AppAssure
  9. 物业管理系统源码java_Java小区物业管理系统 源码报告下载
  10. 信号与系统基础简单知识概括
  11. JAVA 循环结构while简单方法使用
  12. spring cloud gateway filters学习
  13. 国产迪王耀全球(上)
  14. springboot+vue前后端分离项目(后台管理系统)
  15. 微信公众号开发中分享功能 分享微信朋友圈/微信好友
  16. WAF是什么?又有什么作用?
  17. 附件三:防守方评分标准.docx
  18. 跟随Deepmind使用AI玩《星际争霸2》
  19. 相机的硬件接口以及传输协议介绍
  20. 如何用Python求众数

热门文章

  1. C++ 数组动态分配
  2. 探索SQL Server元数据(一)
  3. C#-gdi绘图,双缓冲绘图,Paint事件的触发
  4. 配置F5 负载均衡(转)
  5. 开启关闭Centos的自动更新
  6. 20个开发人员非常有用的Java功能代码(一)
  7. eigrp 非等值负载均衡
  8. 中文分词:采用二元词图以及viterbi算法(一)
  9. fetch jsonp连接mysql_后端接口开发:json,jsonp,restful
  10. Linux安装Prometheus