EM算法(2):GMM训练算法
目录
EM算法(2):GMM训练算法
1. 简介
GMM模型全称为Gaussian Mixture Model,即高斯混合模型。其主要是针对普通的单个高斯模型提出来的。我们知道,普通高斯模型对实际数据拟合效果还不错,但是其有一个致命的缺陷,就是其为单峰函数,如果数据的真实分布为复杂的多峰分布,那么单峰高斯的拟合效果就不够好了。
与单峰高斯模型不同,GMM模型是多个高斯模型的加权和,具体一点就是:
$p(\mathbf{x})\ =\ \sum_k\pi_k\mathcal{N}(\mathbf{x}|\mu_k,\Sigma_k)$
这是一个多峰分布,理论上,只要k足够大,GMM模型能拟合任何分布。
2. 困难
GMM模型比普通高斯模型拟合能力更强了,但是对其训练的难度也增加了。回忆一下,在训练普通高斯模型时,我们是对其分布函数去ln进行求导,具体一点就是:
$\frac{\partial lnp(\mathbf{x})}{\partial \mathbf{\theta}}\ =\ 0$
那么对于普通高斯函数来说,$lnp(\mathbf{x}) = C - \frac{1}{2}(\mathbf{x}-\mu)^T\Sigma^{-1}(\mathbf{x}-\mu)$,可以看到,ln将分布函数中的指数形式消除了,那么对其求导很容易得到闭式解。但是对于GMM模型来说就不是这么简单了。我们可以计算一下,其概率函数取ln形式为:
$lnp(\mathbf{x}) = ln\{ \sum_k\pi_k\mathcal{N}(\mathbf{x}|\mu_k,\Sigma_k)\}$
我们可以看到,因为在ln里面还有加法,所以其无法消除其中的指数形式,导致其最优化问题没有闭式解。所以想要用calculus的方式来解决GMM模型训练的问题是不行的。
3. Inspiration from k-means algorithm
没有什么事情是一步解决不了的,如果有,那就用两步。
--沃 · 兹基硕德
我们重新来看看GMM模型的表达式,其由多个高斯函数相加而成,你可以想想一个空间中有很多高斯函数,它们分别在各自中心点所在的位置。一个一维的三个高斯混合的模型示意如下:

那么对于任何一个点,都有其最靠近的一个峰。比如在中间峰处的点,其概率几乎全是来自于第二个高斯分布。那么我们就可以这样想,是不是每个点都有其更加偏向的高斯峰呢?等等,这个想法好像在哪里见过?k-means算法中的第一步不就是干的这事吗?将每个点都分配给最近的一个类。但是,我们这里怎么去度量距离呢?继续使用点到中心的距离?这样好像把每个高斯的方差忽略掉了。那么既然是概率模型,最好的方法就是用概率来比较。对于一个点$\mathbf{x}$,第k个高斯对其的贡献为$\pi_k\mathcal{N}(\mathbf{x}|\mu_k,\Sigma_k)$,那么把$\mathbf{x}$分配给贡献最大的一个,这样看起来把各个因素考虑进去,似乎很合理了。
但是,我们发现,如果一个点处于两个峰之间呢,这样把其归为任何一个峰都不太好吧?当然,k-means也没有解决这个问题,但是我们这里是概率模型,我们有更好的描述方法,我们可以计算一个点$\mathbf{x}$属于每个高斯的概率。这样的考虑就比较全面了。那么点$\mathbf{x}$属于每个高斯的概率自然就取这个高斯对其的贡献$\pi_k\mathcal{N}(\mathbf{x}|\mu_k,\Sigma_k)$。为了使其成为一个概率,我们还需要对其归一化,所以得到第n个数据点属于第k个高斯的概率:
$\gamma_{nk}=\frac{\pi_k\mathcal{N}(\mathbf{x}_n|\mu_k,\Sigma_k)}{\sum_j\pi_j\mathcal{N}(\mathbf{x}_n|\mu_j,\Sigma_j)}$
按照k-means算法,第二步就是把$\gamma_{nk}$当做已知去做最优化。这里既然是要拟合分布,那么就使用最大似然的方法,最大化$lnp(\mathbf{X})$。那么这里就有一个问题了:在k-means算法中,目标函数是有$r_{nk}$这一项的,然而$lnp(\mathbf{X})$中并没有$\gamma_{nk}$这一项呀,我怎么把其当做已知的呢?这里我们不急,暂时不去管这个,我们先计算$\frac{\partial lnp(\mathbf{X})}{\partial \mu_k}$:
$\frac{\partial lnp(\mathbf{X})}{\partial \mu_k}\ =\ -\ \sum_n\frac{\pi_k\mathcal{N}(\mathbf{x}_n|\mu_k,\Sigma_k)}{\sum_j\pi_j\mathcal{N}(\mathbf{x}_n|\mu_j,\Sigma_k)}\Sigma_k(\mathbf{x}_n\ -\ \mu_k) $ (1)
我们的$\gamma_{nk}$是不是已经出现了,那么上式可以简写为:
$\ -\ \sum_n\gamma_{nk}\Sigma_k(\mathbf{x}_n\ -\ \mu_k)$
令其等于0,可以得到:
$\mu_k\ =\ \frac{\sum_n\gamma_{nk}\mathbf{x}_n}{\sum_n\gamma_{nk}}$ (2)
可以看到,其与k-means算法第二步中心点的计算方法$\mu_k=\frac{\sum_nr_{nk}\mathbf{x}_n}{\sum_nr_{nk}}$非常相似。
类似的,对$\Sigma_k$求导,可以得到:
$\Sigma_k\ =\ \frac{\sum_n\gamma_{nk}(\mathbf{x}_n-\mu_k)(\mathbf{x}_n-\mu_k)^T}{\sum_n\gamma_{nk}}$ (3)
对$\pi_k$求导,可以得到:
$\pi_k\ =\ \frac{\sum_n\gamma_{nk}}{\sum_k\sum_n\gamma_{nk}}$ (4)
自此,GMM训练方法就得到了,第一步,使用式(1)计算所有点的属于各个高斯的概率;第二步,利用式(2),(3),(4)更新均值、方差和权值。重复这两步直到收敛。
4. 与EM算法的关系
这里我们是从k-means算法出发得到的GMM训练算法,那么其与EM算法的关系与k-means算法和EM算法的关系类似。同样,我们后面可以看到,利用EM算法可以推导出GMM训练算法。
EM算法(2):GMM训练算法的更多相关文章
- 传统神经网络ANN训练算法总结
传统神经网络ANN训练算法总结 学习/训练算法分类 神经网络类型的不同,对应了不同类型的训练/学习算法.因而根据神经网络的分类,总结起来,传统神经网络的学习算法也可以主要分为以下三类: 1)前馈型神经 ...
- MATLAB中“fitgmdist”的用法及其GMM聚类算法
MATLAB中“fitgmdist”的用法及其GMM聚类算法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 高斯混合模型的基本原理:聚类——GMM,MA ...
- EM(期望最大化)算法初步认识
不多说,直接上干货! 机器学习十大算法之一:EM算法(即期望最大化算法).能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一般说某个人很NB,是因为他能解决一些别人解决不了的问题.神为什么 ...
- 受限玻尔兹曼机(RBM)学习笔记(七)RBM 训练算法
去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...
- 【原创】batch-GD, SGD, Mini-batch-GD, Stochastic GD, Online-GD -- 大数据背景下的梯度训练算法
机器学习中梯度下降(Gradient Descent, GD)算法只需要计算损失函数的一阶导数,计算代价小,非常适合训练数据非常大的应用. 梯度下降法的物理意义很好理解,就是沿着当前点的梯度方向进行线 ...
- 目标检测算法SSD之训练自己的数据集
目标检测算法SSD之训练自己的数据集 prerequesties 预备知识/前提条件 下载和配置了最新SSD代码 git clone https://github.com/weiliu89/caffe ...
- 物体检测算法 SSD 的训练和测试
物体检测算法 SSD 的训练和测试 GitHub:https://github.com/stoneyang/caffe_ssd Paper: https://arxiv.org/abs/1512.02 ...
- <转>与EM相关的两个算法-K-mean算法以及混合高斯模型
转自http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006924.html http://www.cnblogs.com/jerrylead/ ...
- EM(Expectation Maximization)算法
EM(Expectation Maximization)算法 参考资料: [1]. 从最大似然到EM算法浅解 [2]. 简单的EM算法例子 [3]. EM算法)The EM Algorithm(详尽 ...
随机推荐
- 【转】nginx中的ngx_cdecl
http://blog.csdn.net/midion9/article/details/50605337 看nginx的代码时,发现有些函数返回值之后,还有一个ngx_cdecl关键字,如: 1 ...
- 学习笔记之vector向量容器
今天复习到vector向量容器,里面包括vector向量容器的一些优点以及具体的使用方法及代码,分享给大家. Vector向量容器不但能够像数组一样对元素进行随机访问,还可以在尾部插入元素,是一种简单 ...
- mvc中Url.RouteUrl或者Html.RouteLink实现灵活超链接,使href的值随路由名称或配置的改变而改变[bubuko.com]
mvc,超链接除了直接写在a标签的href内还可以使用路由规则来生成,这样在改变了路由规则或者路由名称时不用再去代码中更改href的值,而且还容易遗漏.借助Url.RouteUrl或者Html.Rou ...
- C#矩阵运算类库
这个类库是本人参考许多相关资料之后做出的C#矩阵运算类库,因为C#的数值计算库相对比较少,所以希望这个类库能够给大家带来一些帮助. 源码github网址:https://github.com/Josh ...
- java.lang.ClassCastException: com.bjsxt.registration.model.User_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
1.懒加载 因为此时用的load懒加载机制,到jsp页面在发送sql语句的时候session已经关闭了.所以会报以上错.可以添加过滤器,使session在请求响应完成后再关闭. 过滤器要配置在stru ...
- docker容器分配静态IP
最近因为工作要求需要用学习使用docker,最后卡在了网络配置这一块.默认情况下启动容器的时候,docker容器使用的是bridge策略比如: docker run -ti ubuntu:latest ...
- 从感知器到SVM
这篇文章主要是分析感知器和SVM处理分类问题的原理,不涉及求解 感知器: 感知器要解决的是这样的一个二分类问题:给定了一个线性可分的数据集,我们需要找到一个超平面,将该数据集分开.这个超平面的描述如下 ...
- 用Spring+Junit4.4进行测试(使用注解)
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRunn ...
- Mybatis 批量更新 ORA-00911: 无效字符的错误
使用<foreach></foreach> 批量insert时报错 ORA-00911: 无效字符的错误 <foreach collection="list&q ...
- 转《UNIX编程艺术》读书心得
花了一段时间看完了<UNIX编程艺术>,但不是看得特别仔细,尤其是后面作者通过对工具的讲解来阐述其设计思想,因为很多工具能未曾接触过,难免就会产生一些乏味的感觉.其实就像译者姜宏在译序里说 ...