EM-高斯混合模型

认识

前面为了直观认识 EM 算法, 用的"扔硬币"的案例, 是为了简化和直观, 而稍微偏应用和深入一点是高斯模型分类,这样一个话题.

就好比我们现在有一堆的数据点, 已经知道是来自于不同的 k 个类别, 每个类别又服从各自的高斯分布, 即k个不同的 (\(\mu, \sigma\))

需求: 求解出这 k 个高斯模型的参数

但现实是, 对于某一个点, 我们并不知道是来自于哪个类别, 因此只能认为任何一个点是这 k 个类别(模型) 的混合(Mixture) 结果.

对某一个点 xi, 它可能有 0.3的概率来自A类, 0.2概率来自B类, 0.1概率来自C类.... 这也是一个概率分布

Mixture of Gaussian 定义

给定一个有 n 个训练数据的集合, \(D=\{ x_1, x_2, x_3, ..x_n\}\) 使用联合概率分布来建模:

\(p(x_i, z_i) = p(z_i)p(x_i|z_i)\), 其中, 假设有 k 个类别分布.

  • \(z_i \rightarrow 多元正态分布(\phi)\) 其中 \(\phi\) 是一个向量
  • \(\phi _j = p(z_i =j) 且 p(z_i | x_i = j) \rightarrow N(\mu_j, \Sigma_j)\)

  • \(\sum \limits_{j=1}^k \phi_j = 1\)

即在一共有 k 个高斯模型下, \(\phi_j\) 为混合模型中的第 j 个高斯模型占的权重. 设 k 为 \(z_i\) 的可能取值上限即每个xi 的产生:

  • 随机从 {1,2,3,....k} 中选择一个 \(z_i\)

  • 然后从 \(z_i\) 对应的高斯分布中产生 \(x_i\)
  • \(z_i\) 为不能直接观测到的 隐含变量, \(\phi, \mu, \Sigma\) 为需要预测的参数

E步: 让 \(\mu, \Sigma\) 不变, 更新 \(\phi\)

M步: 让 \(\phi\) 不变, 更新 \(\mu, \Sigma\)

对应的对数似然函数如下:

\(l(\phi, \mu, \Sigma) = \sum \limits _{i=1}^n \ p(x_i; \phi, \mu, \Sigma)\)

\(= \sum \limits _{i=1}^n log \ \sum \limits _{z_i=1}^k p(x_i | z_i; \mu, \Sigma) p(z_i; \phi)\)

这是个全概率分布: \(\phi \rightarrow z_i \rightarrow x_i\)

给定 \(\phi\) 下, \(z_i\) 的分布; 给定 \(z_i\) 下, \(x_i\)的分布

参数估计

核心还是似然函数和贝叶斯公式

E 步: 为第 i 个数据, 其所属 k 个类别中的 第 j 个类别的概率分布 (有点绕哈):

\(w_j^{(i)} = Q_i(z_i = j) = P(z_i = j | x_i; \phi, \Sigma, \mu)\)

即给定 \(\phi, \mu, \Sigma, x_i\) 的条件下, \(P(z_i = j)\) 的概率有多大

M 步: 最大化似然函数:

\(\sum \limits _{i=1}^n \sum \limits_{z_i =1}^k Q_i(z_i) \ log \frac {p(x_i, z_i; \phi, \mu, \Sigma)}{Q_i(z_i)}\)

即已知 \(x_i, z_i\) 的条件下, 去更新 \(\mu, \Sigma\)

\(=\sum \limits _{i=1}^n \sum \limits_{j =1}^k Q_i(z_i =j) \ log \frac {p(x_i | z_i=j; \mu, \Sigma)p(z_i =j; \phi)}{Q_i(z_i=j)}\)

\(=\sum \limits _{i=1}^n \sum \limits_{j =1}^k w_j^{(i)} \ log \frac {\frac {1}{(2 \pi)^{0.5n}|\Sigma|^{0.5}}exp(-0.5(x_i - \mu_j)^T \Sigma_j^{-1}(x_i -\mu_j))* \phi_j}{w_j^{(i)}}\)

\(w_j^{(i)}\) 是非常容易算的, 就是之前的扔硬币嘛

但更新 \(\Sigma_j, \mu_j\) 就麻烦了

只能分别对 \(\Sigma, \mu\) 来求偏导了呀, 于是, 对期望 \(\mu_l\) 求偏导( \(\mu_l\) 表示 \(j = l\) 的时候哦:

\(\nabla_{\mu_l}=\sum \limits _{i=1}^n \sum \limits_{ j=1}^k w_j^{(i)} \ log \frac {\frac {1}{(2 \pi)^{0.5n}|\Sigma|^{0.5}}exp(-0.5(x_i - \mu_j)^T \Sigma_j^{-1}(x_i -\mu_j))* \phi_j}{w_j^{(i)}}\)

化繁为简单, 利用 log 性质

上式相当于 \(log(\frac {abc}{d}) = loga + logb +logc - logd\)

即原式对 \(\mu_j\) 求导, 只跟中间的那项有关, 跟 exp 前面的高斯项, 还是 \(\phi_j\) 没有任何关系滴

\(\nabla_{\mu_l}=\sum \limits _{i=1}^n \sum \limits_{z_i =1}^k w_j^{(i)} \ log-0.5(x_i - \mu_j)^T \Sigma_j^{-1}(x_i -\mu_j)\)

只是对 \(\mu_l\) 求导, 只有当 j = l 的时候呢, 才会考虑 这 \(\sum\)求和, 即求和是没有真正起作用的, 可以直接去掉

\(=\sum \limits _{i=1}^n w_j^{(i)} \nabla_{\mu_l} \ log-0.5(x_i - \mu_j)^T \Sigma_j^{-1}(x_i -\mu_j)\)

$=0.5 \sum \limits {i=1}^n w_l^{(i)} \nabla{\mu_l}2\mu_l^T \Sigma_l ^{-1}x_i - \mu_l^T \Sigma_l^{-1}\mu_l $

\(=\sum \limits _{i=1}^n w_l^{(i)} ( \Sigma_l ^{-1}x_i -\Sigma_l^{-1}\mu_l)\)

令其等于 0 即:

\(\mu_l = \frac {\sum \limits _{i=1}^n w_l^{(i)} x_i}{\sum \limits _{i=1}^n w_l^{(i)} }\)

同理 再对 \(\Sigma\) 偏导, 令其为零, 跟上面是一样的.

\(\Sigma_j = \frac {\sum \limits _{i=1}^n w_j^{(i)} (x_i -\mu_j)(x_i-\mu_j)^T}{\sum \limits _{i=1}^n w_j^{(i)}}\)

同理 对 \(\phi_j\) 求偏导, 只保留包含 \(\phi_j\) 的项, 即:

\(\sum \limits _{i=1}^n \sum \limits_{j =1}^k w_j^{(i)} log(\phi_j)\)

回顾上文, \(\phi_j = p(z_i = j; \phi)\) 是一个概率分布, \(\sum_{j=1}^k \phi_j = 1\) 即是一个求条件极值的经典问题, 那很自然要引入到拉格朗日函数啦.

\(l(\phi) = \sum \limits _{i=1}^n \sum \limits_{j =1}^k w_j^{(i)} log(\phi_j)- \beta (\sum \limits _{j=1}^k \phi_j -1)\)

对 \(\phi_j\) 求偏导, 令值为0:

同样对于 j = 1,2..k 来说, 其实 求和只是对满足条件的一项, 并未对其他产生作用

\(\nabla_{\phi_j} l(\phi) = \sum \limits_{i=1}^n \frac {w_j^{(i)}}{\phi_j} + \beta\) = 0

这里的 求和 是对 i 哦, 跟 j 是没有关系滴

\(\phi_j = \frac {\sum \limits _{i=1}^n w_j^{(i)}}{-\beta}\)

又因为 所有的 \(\phi\) 的和是 1,可得到:

\(\sum \limits _{j=1}^k \frac {\sum \limits _{i=1}^n w_j^{(i)}}{-\beta} = 1\)

\(\beta\) 是常数, 可以提出来

\(\frac {1}{-\beta} \sum \limits _{j=1}^k \sum \limits _{i=1}^n w_j^{(i)} = 1\)

又因为 \(w_j^{(i)} = Q_i(z_i = j)\) 因此得到:

\(\frac {1}{-\beta} \sum \limits _{i=1}^n 1 = 1\)

则: \(-\beta = n\) 这样一来, 最终化简得出:

\(\phi_j = \frac {1}{n} \sum \limits_{i=1}^n w_j^{(i)}\)

小结

重复执行 E, M 步骤, 直到收敛...

while True:

E-步: (即给定 \(\phi, \mu, \Sigma, x_i\) 的条件下, \(P(z_i = j)\) 的概率有多大)

​ \(w_j^{(i)} = Q_i(z_i = j) = P(z_i = j | x_i; \phi, \Sigma, \mu)\)

M-步: (更新参数 \(\Sigma, \mu\))

​ \(\mu_l = \frac {\sum \limits _{i=1}^n w_l^{(i)} x_i}{\sum \limits _{i=1}^n w_l^{(i)} }\)

​ \(\Sigma_j = \frac {\sum \limits _{i=1}^n w_j^{(i)} (x_i -\mu_j)(x_i-\mu_j)^T}{\sum \limits _{i=1}^n w_j^{(i)}}\)

​ \(\phi_j = \frac {1}{n} \sum \limits_{i=1}^n w_j^{(i)}\)

​ IF 收敛:

​ break

总体上, 还是有点难度的感觉, 就是 大小类的层级关系 加上 条件概率, 真的是挺容易晕的, 也不太确定, 是否一定正确, 还是过后再来仔细检查一波.

EM-高斯混合模型的更多相关文章

  1. 高斯混合模型与EM算法

    对于高斯混合模型是干什么的呢?它解决什么样的问题呢?它常用在非监督学习中,意思就是我们的训练样本集合只有数据,没有标签. 它用来解决这样的问题:我们有一堆的训练样本,这些样本可以一共分为K类,用z(i ...

  2. EM算法原理以及高斯混合模型实践

    EM算法有很多的应用: 最广泛的就是GMM混合高斯模型.聚类.HMM等等. The EM Algorithm 高斯混合模型(Mixtures of Gaussians)和EM算法 EM算法 求最大似然 ...

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

    # coding:utf-8 import numpy as np def qq(y,alpha,mu,sigma,K,gama):#计算Q函数 gsum=[] n=len(y) for k in r ...

  4. GMM高斯混合模型学习笔记(EM算法求解)

    提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...

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

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

  6. 高斯混合模型的EM算法

    高斯混合模型的EM算法 混合高斯模型 高斯混合模型的概率分布可以写成多个高斯分布的线形叠加,即 \[ p(\mathbf x) = \sum_{k=1}^{K}\pi_k\mathcal N(\mat ...

  7. 机器学习算法总结(六)——EM算法与高斯混合模型

    极大似然估计是利用已知的样本结果,去反推最有可能(最大概率)导致这样结果的参数值,也就是在给定的观测变量下去估计参数值.然而现实中可能存在这样的问题,除了观测变量之外,还存在着未知的隐变量,因为变量未 ...

  8. 6. EM算法-高斯混合模型GMM+Lasso详细代码实现

    1. 前言 我们之前有介绍过4. EM算法-高斯混合模型GMM详细代码实现,在那片博文里面把GMM说涉及到的过程,可能会遇到的问题,基本讲了.今天我们升级下,主要一起解析下EM算法中GMM(搞事混合模 ...

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

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

  10. 4. EM算法-高斯混合模型GMM详细代码实现

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 EM ...

随机推荐

  1. 《icra16_slam_tutorial_tardos.pdf》

    icra16_slam_tutorial_tardos.pdf EKF: https://www.cnblogs.com/gaoxiang12/p/5560360.html 7. 小结 卡尔曼滤波是递 ...

  2. MySQL数据库实战之优酷

    目录 一.项目总结三步骤 二.项目需求分析 三.搭建框架 四.ORM框架分析 五.数据库设计 六.项目中各个功能模块分析 七.项目中遇到的问题及怎么解决的 八.客户端代码框架 8.1 conf 8.1 ...

  3. 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题

    UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器.而且,它非常适合虚拟环境,比如:Docker.另外,它通过消费未来时间克服了雪花算法的并发限制.Uid ...

  4. 用Fastclick解决移动端300ms延迟问题

    移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击. 为了能够立即响应用户的点击事件,才有了FastClick. 用法: 引入fastclick. ...

  5. 关于Unity中AI随机巡逻障碍物预判与快速运动时物理穿透的思考

    如果不想用Unity的导航系统,很多时候就要解决如何预判前进路径中的障碍物问题,之前也看过一些非常经典的寻路算法例如AStar寻路,虽然也可实现功能,但总感觉有些小题大做.寻路算法大多数都是为了得出最 ...

  6. pytest框架之parametries数据驱动参数化

    在测试用例的前面加上:@pytest.mark.parametrize('参数名', 列表数据) 参数名:用来接收每一项数据,并作为测试用例的参数 列表参数:一组测试数据(元组.列表.字典) 方式一: ...

  7. WPF 解决多个TreeViewItem同时触发某事件的简单方法

    原理是: 因为是双击事件,也就是同时引发了选择事件,TreeViewItem的IsSelected为True.通过触发器设置某个属性为特殊值,然后在CS页面的双击事件方法内判断是否此值即可. xaml ...

  8. 常见跨域解决方案以及Ocelot 跨域配置

    常见跨域解决方案以及Ocelot 跨域配置 Intro 我们在使用前后端分离的模式进行开发的时候,如果前端项目和api项目不是一个域名下往往会有跨域问题.今天来介绍一下我们在Ocelot网关配置的跨域 ...

  9. python 对Unicode解码

    打印: print('我喜欢你'.encode('unicode_escape')) 得到Unicode编码: b'\\u6211\\u559c\\u6b22\\u4f60 将上面的编码赋值给str后 ...

  10. Python绘图还在用Matplotlib?out了 !发现一款手绘可视化神器!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. GitHub 地址:https://github.com/chenjian ...