EM-高斯混合模型
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
总体上, 还是有点难度的感觉, 就是 大小类的层级关系 加上 条件概率, 真的是挺容易晕的, 也不太确定, 是否一定正确, 还是过后再来仔细检查一波.
最新文章
- [moka同学笔记]php 获取时间(今天,昨天,三天内,本周,上周,本月,三年内,半年内,一年内,三年内)
- Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended
- PHP多重判断删除文件函数
- NBearV3中文教程总目录
- OBIEE 11g:Error:nQSError 36010 Server version 318 cannot read the newer version of the repository
- 为Elasticsearch添加中文分词
- 布局时margin会影响父元素
- BZOJ_2194_快速傅立叶之二_(FFT+卷积)
- android Service Activity三种交互方式(付源码)
- C#按键打开文件选择对话框,并把选择好的路径保存/显示到textBox
- [UWP小白日记-8]一些零碎的东西
- shell 编程案例整理
- 24 python初学(异常)
- Python常用高级函数
- WinForm DataGridView 绑定泛型List(List<;T>;)/ArrayList不显示的原因和解决
- PHP索引数组+unset使用不当导致的问题
- AOP 和 前置通知,后置通知
- Unity特殊路径
- ASP.NET MVC学习笔记-----Filter(1)
- git 学习之撤销和删除