HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)
HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)
回顾 HMM
上篇介绍了HMM这样的一种时序类模型, 即描述了一些观测现象的产生, 是由我们很难观测到的 "隐变量因子", 产生的, 同时这些隐变量因子之间的变化也有一个状态转移概率的过程.
HMM 的推导过程, 也就两个部分, Z 过程 (推断过程) 和 Estimation(参数估计)过程.
上篇对于 Z 过程, 有通过类似于 枚举法 和 一种 DP (动态规划) 算法来求解最好的 Z, 其前提假设是模型的参数 (初始状态, 状态转移概率矩阵, 发射概率) 已知 下来求解的. 嗯. 推导思路过程有点类似之前的 XGBoost 算法, 也是先假定, 再推导, 在证明假设前提这样的套路, 过程又用到了 EM算法来求解.
如果我是面试官, 问HMM, 这相当于将 EM 和 DP 算法 同时问了, 这样的问题就很有质量哦.
12月底恰好tableau老铁跟我分享动态规划,果然数学系就是不一样, 用爬n阶楼梯来说明, 斐波那契数. DP的核心思想就是将问题规模不断缩小求解, 不同于递归哈, 后面可以单独举个 DP 栗子.
so, 本篇就来整一波, 如何进行参数求解.
\(\theta = (\pi, A, B)\)
假设有5个状态, 同样是扔2个硬币
\(\pi\) 表示初始状态, 如: \(\pi = [0.8, b, c, d, e]\)
A 表示两个状态的转移矩阵; 是一个 5x5 的方阵
B 表示发射概率 (隐含规则->观测的概率值); 是一个 5x2 的矩阵
如果是词性分析, 则矩阵就非常大了, 如果观测是连续型 则需要用 概率分布来描述了.
对于, HMM, 要求解出这3个参数, 主要有两个步骤, 或者说是2个关键点:
- 给定模型的参数, 找出最适合的 Z => Inference (推断过程)
- 估计模型参数的 \(\theta\) => Parameter Estimation (估计过程)
Complete VS lncomplete "Z"
Z 就是隐变量, X 是对应的观测值.
X 已知, Z 已知, 则通过简单的 频率 统计即可求解出参数
X 已知, Z 未知, 则通过 EM 算法求解. (E 步更新发射概率, M 步更新参数值, 这样循环交替直到收敛, 即得参数
发射概率
就是 隐变量 z1 -> x1 (观测值) 的概率. 可参考EM篇的扔硬币, 上帝视角, 事先知道 试验结果是由 哪个硬币产生的, 或知道概率. (如第1次是 "正", 我知道有 70% 概率来自 A 硬币, 30%概率来自 B硬币, 这个概率矩阵 [0.7, 0.3] 就是 发射概率)
转移概率
描述状态之间的变化规律. 如还是扔硬币, 每次对 A, B 硬币的选择策略不同, 如 AAB, ABA ... 的场景, 可通过转移概率矩阵来描述.
ps: 老铁昨天问我是数论强, 还是分析强...嗯, 我只想说, 作为文科生(商科), 只是熟练使用数学工具而已....
另外想分享一点工具论, 在我眼里, 数学符号, 公式, 代码, 其实本质都是一样的, 就是一个靠谱的工具, 目标都是为了对现实世界的另一种刻画. 当然世界很大, 可以感性认知, 也可理性认知, 探索的过程是其乐无穷的. 我感觉自己内心还是一个文艺青年的特征, 追求内心的感受, 也有故作伤春悲秋....不说这些了..
Complete "Z"
假设有 3个观测样本, Z 是已知时:
s1:
z : 1, 1, 2, 2, 2, 3
x : a, b, a, c, c, b
s2:
z : 2, 1, 3, 3, 2
x : a, a, c, b, a
s3:
z : 1, 1, 3, 2
x : b, a, a, c
在 z 已知道的这种 上帝视角 下, 求解 参数 (初始状态, 状态转移矩阵, 发射概率) 就是词频统计, 然后归一化作为概率值 , 非常容易的.
为了方便简单演示, 假设样本空间 就是上面这3个样本, 观测值和其隐变量状态都是已知的.
首先来估计 \(\pi\) (初始状态) 即每一个样本(向量 1x3) 的第一状态分量的频数统计, (约定先行后列哦)
状态1 | 状态2 | 状态3 | |
---|---|---|---|
频次 | 2 | 1 | 0 |
然后再 归一化 得到 初始状态 (向量) :
\(\pi = [\frac {2}{3}, \frac {1}{3}, \frac {0}{3}]\)
接着来估计 A (状态转移矩阵), 状态与状态间的, 即 3x3 的矩阵. 同时, 状态要 横向来看, 统计是 先行后列
---> | 状态1 | 状态2 | 状态3 |
---|---|---|---|
状态1 | 2 | 1 | 2 |
状态2 | 1 | 2 | 1 |
状态3 | 0 | 2 | 1 |
按行 进行归一化即可得到概率 (严格来说, "频率" 应该更适合, 但我们通常都是用 样本估计总体, 也说得通哈)
---> | 状态1 | 状态2 | 状态3 |
---|---|---|---|
状态1 | 2/5 | 1/5 | 2/5 |
状态2 | 1/4 | 2/4 | 1/4 |
状态3 | 0/3 | 2/3 | 1/3 |
最后来估计 B (发射概率矩阵), 即每个状态下, 每个观测值的概率, 即可 3x3 的矩阵 (统计也是约定, 先行后列哈)
---> | a | b | c |
---|---|---|---|
状态1 | 3 | 2 | 0 |
状态2 | 3 | 0 | 3 |
状态3 | 1 | 2 | 1 |
同样 按行 做归一化可得到 发射概率矩阵 B:
---> | a | b | c |
---|---|---|---|
状态1 | 3/5 | 2/5 | 0/5 |
状态2 | 3/6 | 0/6 | 3/6 |
状态3 | 1/4 | 2/4 | 1/4 |
因此, 在已知 Z 的情况下, 要做的就是直接统计出了 模型的参数: 初始概率状态(向量), 状态转移概率 (矩阵), 发射概率 (矩阵). 站在上帝视角, 果然爽歪歪. 此处突然想到了基本经济社会问题. 就是, 你所掌握资源越多, 就越有发言权, 做事情成功的概率必然很大和相对轻松.
Incomplete "Z"
而我们身处的现实世界, 几乎是没有上帝视角的. 它只存在于理论的乌托邦世界. 于是在现世的洪流, 我们通常只是看到 观测到的现象, 而无法得知现象背后的上帝,是如何扔骰子的, 即便如此, 我们依旧去进行一个逼近, 利用智慧, 嗯, 说得有高大上, 这里其实就用到 EM 算法来进行一个参数估计即可.
\((x, z) - 简单统计 - \theta\) 而,
$ (x, ) - how - \theta$
F/B 算法 ( Forward And Backward)
就要要计算出 \(p(z_k | x)\) 即 在 给定 x 的情况下, 可以计算 任意时刻状态下的 z 的期望
通过 F/B 算法, 可以计算出: \(p(z_k = 1 |x), p(z_k = 2 |x), ....p(z_k = m |x)\)
也就是说, 通过 观测 X, 计算出了 Z, 然后简单统计则可 估计出模型的参数, 再来捋一波条件
F / B : \(p(z|x)\)
Forward : 用来计算 \(p(z_k | x_{1...k})\)
Backward : 用来计算 \(p(x _{k+1, ...n} | z_k)\)
如何将它们关联起来呢, , 涉及条件概率, 同时也会想到贝叶斯公式 呀.
\(p(z_k|x) = \frac {p(z_k, x)}{p(x)}\)
这里的 x 表示所有的 n 个样本嘛, 因此为了和 F, B 产生联系, 可以将 x 进行划分 (展开).
\(p(z_k, x) = p(z_k, x_{1...k}, x_{k+1...n})\)
\(=p(z_k, x_{1...k}) \ p(x_{k+1...n} | z_k, x_{1..k})\)
可以省略掉 \(x_{1...k}\) 考虑条件独立的情况下, 其对条件概率是没有影响的.
\(=p(z_k, x_{1...k}) \ p(x_{k+1...n} | z_k)\)
为啥是 条件独立成立?
因为, directional separation 性质: (嗯, 就可理解为条件独立的一种更高级的一个性质), 用处就是帮助我们来判断多个变量中, 有哪一些变量之间, 是有条件独立的性质的, 或者是把很多的变量看作一个集合.
我们在谈条件独立的时候, 通常是以单个变量来参照的. 然而涉及多个变量, 则需用的 D-separation 性质了呀. 嗯....举个栗子, 假设我有两波变量, 然后通过 D-separation 性质, 可以帮我们判断, 其中一波变量, 是否对其条件概率产生了影响. 算是一个更加泛化的一个条件独立性质.
在本例中, 我们把 X, 拆分成了 \(x_{1...k-1}, \ x_k, \ x_{k+1...n}\) 在 D-separation 性质中, \(x_k\) 这个分割点被称为 Block , 如果当 存在变量 (可以多个) x - Block - y 且指向关系是 x -> Block -> y 的时候, 则可以认为, x(变量集合) 是条件独立于 Block 的. 因此可以省略掉. (具体 D-separation 性质证明, 后面再补一波百度吧, 先用上再说)
最终 \(p(z_k, x) = p(z_k, x_{1...k}) \ p(x_{k+1...n}|z_k)\) 即通过计算 Forward 和 Backward 完成最终求解.
重要信息,再重复一遍: 我们为了计算 \(p(z|k)\) 其实只需要计算出 Forward 和 Backward 即可, 这也就是 通过 X 计算出了 Z, 从而依上 complete 的简单统计, 求解出模型参数
然后关如何去定义 Z 的个数, 其实是一个超参数, 有点类似于 EM算法中, 最开始 E部的初始值, 人工可以根据经验来控制的.
小结
然后好像有点大篇幅的在弄 F/B 算法, 而开篇主要想阐明参数估计的核心是 EM算法, 那体现在何处呢? 我们捋一波求解参数的过程:
首先, 我们是要通过在给定 X 的情况下, 求解出 Z 的期望, 这个求解过程用到了 F/B 算法;
其次, 我们通过已知 (X, Z) 来求解出了参数 \(\theta\)
这, 不就是 EM 算法的 E步 和 M 步了呀.
最后, 其实还遗留了一个问题, 就是如何求解 F/B 嗯, 想一波先. 框架是没问题了, 这就跟写代码一样, 逻辑结构, 模块划分已经搭起来了, 然后就是慢慢去找别人的代码来复制粘贴的过程, 先想一波哈.
HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)的更多相关文章
- hmm隐马尔可夫真的那么难吗?
hmm隐马尔可夫真的那么难吗? 首先上代码 这里是github上的关于hmm的:链接 概率计算问题:前向-后向算法 学习问题:Baum-Welch算法(状态未知) 预测问题:Viterbi算法 htt ...
- HMM隐马尔可夫模型来龙去脉(二)
目录 前言 预备知识 一.估计问题 1.问题推导 2.前向算法/后向算法 二.序列问题 1.问题推导 2.维特比算法 三.参数估计问题 1.问题推导 2.期望最大化算法(前向后向算法) 总结 前言 H ...
- Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫。 马尔可夫链,的原理attilax总结
Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫. 马尔可夫链,的原理attilax总结 1. 马尔可夫过程1 1.1. 马尔科夫的应用 生成一篇"看起来像文章的 ...
- HMM隐马尔可夫模型(词语粘合)
HMM用于自然语言处理(NLP)中文分词,是用来描述一个含有隐含未知参数的马尔可夫过程,其目的是希望通过求解这些隐含的参数来进行实体识别,说简单些也就是起到词语粘合的作用. HMM隐马尔可夫模型包括: ...
- HMM隐马尔可夫模型来龙去脉(一)
目录 隐马尔可夫模型HMM学习导航 一.认识贝叶斯网络 1.概念原理介绍 2.举例解析 二.马尔可夫模型 1.概念原理介绍 2.举例解析 三.隐马尔可夫模型 1.概念原理介绍 2.举例解析 四.隐马尔 ...
- HMM隐马尔科夫算法(Hidden Markov Algorithm)初探
1. HMM背景 0x1:概率模型 - 用概率分布的方式抽象事物的规律 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测. 概率模型(p ...
- HMM隐马尔科夫模型
这是一个非常重要的模型,凡是学统计学.机器学习.数据挖掘的人都应该彻底搞懂. python包: hmmlearn 0.2.0 https://github.com/hmmlearn/hmmlearn ...
- 机器学习-HMM隐马尔可夫模型-笔记
HMM定义 1)隐马尔科夫模型 (HMM, Hidden Markov Model) 可用标注问题,在语音识别. NLP .生物信息.模式识别等领域被实践证明是有效的算法. 2)HMM 是关于时序的概 ...
- 自然语言处理(1)-HMM隐马尔科夫模型基础概念(一)
隐马尔科夫模型HMM 序言 文本序列标注是自然语言处理中非常重要的一环,我先接触到的是CRF(条件随机场模型)用于解决相关问题,因此希望能够对CRF有一个全面的理解,但是由于在学习过程中发现一个算法像 ...
- HMM 隐马尔科夫 Python 代码
import numpy as np # -*- codeing:utf-8 -*- __author__ = 'youfei' # 隐状态 hidden_state = ['sunny', 'rai ...
随机推荐
- 多项式算法再探:FMT 和 FWT
我们知道,FFT 和 NTT 可以用来解决下面这种问题: \[c_k=\sum_{i+j=k}a_ib_j \] 不过,这并不是卷积的全部形态,比如下面这种: \[c_k=\sum_{i*j=k}a_ ...
- 微信小程序如何访问带有Token安全认证的API
展开微信小程序访问Token安全验证的API接口API//添加一个自定义过滤器using Newtonsoft.Json;using System;using System.Collections.G ...
- 在Unity中玩转表达式树:解锁游戏逻辑的动态魔法
html { overflow-x: initial !important } :root { --bg-color: #ffffff; --text-color: #333333; --select ...
- 八米云-ESXi虚拟机安装教程
疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 准备阶段: 八米云启动U盘(制作方法可参看<制 ...
- Ansible - [04] 关于sudo的一些配置
sudo sudo,以超级管理员或其他人的身份执行命令 基本流程 管理员需要先授权(修改/etc/sudoers文件) 普通用户以sudo的形式执行命令 可以通过sudo -l查看授权情况 配置sud ...
- Windows 提权-SeImpersonatePrivilege 特权
本文通过 Google 翻译 SeImpersonatePrivilege – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- 机器学习 | 强化学习(4) | 无模型控制(Model-Free Control)
无模型控制(Model-Free Control) 无模型预测概论 上一节课: 无模型预测 用于估计一个未知马尔科夫决策过程的价值函数 这节课 无模型控制 最优化一个未知马尔科夫决策过程的价值函数 一 ...
- js回忆录(3) -- 循环语句,前后缀运算符
计算机对于大批量数据的处理速度比起人类不知道快了多少,因此对于重复的操作,使用循环语句处理是很方便的,对于我们前端来说,给同一标签的元素绑定事件啦,tab切换啦,左右联动效果啦,等等都可以使用循环语句 ...
- dcgm-exporter:Collect Switch Metrics和Collect Link Metrics
在 DCGM(Data Center GPU Manager)中,"Collect Switch Metrics" 和 "Collect Link Metrics&quo ...
- Go new函数 例子解析答疑
package main import "fmt" func main() { p1 :=new(int) *p1 =1 fmt.Println("p1",p1 ...