HMM (隐马尔可夫) 推导 (上) - Viterbi算法求解 隐变量
认识
跟 EM 算法的那部分是有些类似的思想, 引入 "隐变量" (Latent Variable).
对于观测样本:
\(x_1, x_2, x_3, ...x_n\)
存在相对应的 Latent 变量:
\(z_1, z_2, z_3, ...z_n\)
可以理解为观测值的另一种表示, 而且很难直观去观测到, 就像之前 EM 里面的扔硬币, 只能看到最后结果, 却不知道该结果是由哪个硬币产生 的.
在 HMM 中, 我们把 \(z_1, z_2, ...z_n\) 叫做 状态, 不同的状态, 生成对应的 观测值, 而状态之间是有一个状态转移(矩阵)
case 扔硬币
跟之前的 EM 一样的. 假设有2个硬币 A, B , 已知事件, 正面朝上的概率分别为 \(\mu_1, \mu_2\) 即:
\(A: \ P(正面) = \mu_1; \ p(反面) = 1-\mu_1\)
\(B: \ P(正面) = \mu_2; \ p(反面) = 1-\mu_2\)
现在开始扔硬币, 我们只能看到最终的结果, 却不知该结果是由哪个硬币产生的.
也不是乱扔, 扔也是有一定概率分布(状态转移)的, 只是不知道而已
我们重点关系如下几个问题:
- 假设知道模型参数(就假设知道 z1->x1, z2-x1 的概率下, 如何通过 观测结果 反推 背后逻辑
Viterbi 算法 求解
- 只知道观测值, 如何进行参数估计 (此处就是通过 "正,反"的结果去估计 z 的转移概率和 \(\mu_1, \mu_2\)
可用前面的 EM 算法求解
- 参数已知, 如何根据观测值去做 预测
预测
需求: 计算 \(p(正, 正, 正, 反, 正, 反)\)
求解: 考虑所有的状态 \(s\) , 即: \(\sum \limits_{s} p(正, 正, 正, 反, 正, 反 | s) p(s)\) => 可用DP算法求解 (动态规划)
硬币自身的产生"正面朝上" 的概率, 被称为 发射概率 (Emission Probability)
如何选择下一次扔哪个硬币的这个规律性 \(\theta\), 被称为 转移概率 (Transtion Probability)
还有最开始的一个状态, 嗯, 就叫初始状态 Initialization 吧
转移矩阵是要通过学出来, 通过EM算法来找出背后的逻辑呀
对于初始状态, 相当于第一实验, 有一个策略, 比如 0.7 概率会选择A, 0.3 概率选择B, 然后后面的则根据 \(\theta\) 参数来选择呀
可以发现, 核心的参数求解过程, 还是用的EM算法呀, 需求解出3个参数: 初始状态, 发射概率, 转移矩阵
case2 词性分析
其实我们每说一句话, 是有背后的词性逻辑的, 即语法. 只是我们平时并不关注而已, 但, 存在.
隐变量 : 主 + 谓 + 宾
观测值 : 我 + 想 + 你
对于 隐变量, 即"主谓宾"的顺序, 是有规律的, 这个规律就是我们说的 状态转移矩阵
而我们直接听到的是 "我想你"
于是 HMM 用在在词性分析上,
EM 部分, 所要做的事情是, 通过 我想你 这样的句子, 去 发现背后的 主谓宾 的词性规律
而预测部分则是, 通过算好的模型参数, 去生成新的句子.
感觉这不是就是在打造一个 聊天机器人吗
HMM 参数估计
\(\theta = (A, B, \pi)\)
假设有5个状态, 同样是扔2个硬币
\(\pi\) 表示初始状态, 如: \(\pi = [0.8, b, c, d, e]\)
A 表示两个状态的转移矩阵; 是一个 5x5 的方阵
B 表示发射概率 (隐含规则->观测的概率值); 是一个 5x2 的矩阵
如果是词性分析, 则矩阵就非常大了, 如果观测是连续型 则需要用 概率分布来描述了.
对于, HMM, 要求解出这3个参数, 主要有两个步骤, 或者说是2个关键点:
- 给定模型的参数, 找出最适合的 Z => Inference (推断过程)
- 估计模型参数的 \(\theta\) => Parameter Estimation (估计过程)
最好的 Z 状态 - 枚举法
Z 就是隐变量.
前提条件是模型参数已知哦.
最能想到的一种方式, 就是枚举法, 将 所有可能的 z 都枚举出来, 选择最好的一个 z 状态.
什么是最好的状态, 就是 极大似然估计最大的参数呀
具体如何选择呢, 假设 z = 1, 1, 1, 1, 1 其实就是:
\(p(x, z) = [p(z_1 = 1)p(z_2 = 1|z_1=1)p(z_3=1|z_2=1)p(z_4=1 |z_3=1) p(z_5=1|z_4=1) ] \\ * [p(x_1 |z_1=1) p(x_2|z_2=1) p(x_3|z_3=1)p(x_4|z_4=1)p(x_5|z_5=1)]\)
同样, 简化一点哈, 假设 状态有3种, z = 1,3, 2则:
\(p(x, z) = [p(z_1=1)p(z_2=3 |z_1=1)p(z_3=2|z_2=3)] * [p(x_1|z_1=1)p(x_2|z_2=3)p(x_3|z_3=2]\)
....
最后选出最大的 状态 Z 即可呀. (有点像, 求给定 z 求最大的后验概率 \(p(z|x) = \frac {p(z,x)}{p(x)}\) 分母一样, 只关心 分子p(z, x)即可, 但涉及p(x)的计算很麻烦, 而我们目的是最大化 p(z|x) => 关注 p(z, x) 即可, p(x) 是不需要考虑的)
目标导向和数学思维才是最为重要的, 注, 此阶段是假定已经知道所有模型参数的情况下来求解哦
对于离散型的, 即一个状态对应 一个向量, 可用用 不同的(均值, 方差) 的高斯分布来进行估计 发射概率, 每一个状态就对应一个高斯分布而已. 参数是 \((\mu, \Sigma)\) 也都是学出来的 (就是模型的 B),
最好的 Z 状态 - Viterbi 算法
比之前的枚举还是要好一点, Viterbi 就是一个 动态规划算法.
z_1 z_2 z_3 z_4 z_5 z_6 z_n
1 x x x x x x x
2 a a x x x x x
j x x a a x a x
... x x x x a x a
m x x x x x x x
列就表示 我们要求解的状态, 行表示每个状态想的所有取值
这样来看, 其实我要求最好的 z 则 是去选择 z1 ... z_n 最好的 路径, 使得这个路径的值, 即联合概率 p(x, z) 是最大的
so, 这样问题就变成了, 寻找最优路径, 关于找路径, 可以用 动态规划算法求解的哦. 先定义个一变量:
\(\delta_k (j)\)
表示一开始从 状态 z_1 到 状态 z_k 且 z_k 取值为 第j 行的那个 节点的最好路径的值
\(\delta _{k+1} (j)\)
表示 z_(k+1) 最好的状态, 跟其前一个状态 z_k 的每个取值(行) 是有关联的, 一直往前这样去 分割问题
\(\delta _{k+1} (j) = max\) (
\(\delta_{k(1)} + log \ p(z_{k+1}=j | z_k=1)\),
\(\delta_{k(2)} + log \ p(z_{k+1}=j | z_k=2)\),
\(\delta_{k(3)} + log \ p(z_{k+1}=j | z_k=3)\),
...
\(\delta_{k(m)} + log \ p(z_{k+1}=j | z_k=n)\),
)
其实每一项还有一个发射概率, 可以省略, 因为每行, 其实是一样的值呀
整个过程有点跟 XGBoost 有点像. 在计算 \(\delta_1 ....\delta_n\) 每后一下的行值, 都是由前一列的值来计算出来的, 这样一直从前往后的过程, 全部循环过后呢, (就很像是在按列填充一个二维表) .
最后的评估, 其实就是从最后一列值中选择最大的值, 及其所在的节点位置, 然后从后往前进行节点的 "溯源" 就完整地画出了最优路径了呀.
由此再从前往后写出最后的 z 答案 (假设上述的 a) 则: z = 2, 2, .j..j..j)
至此, 关于 HMM 的 inference 部分就求解结束, 然后, 是关于参数估计的部分推导.
HMM (隐马尔可夫) 推导 (上) - Viterbi算法求解 隐变量的更多相关文章
- 隐马尔可夫模型及Viterbi算法
隐马尔可夫模型(HMM,hidden Markov model)是可用于标注问题的统计学模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型.HMM模型主要用于语音识别,自然语言处理,生物 ...
- 隐马尔科夫模型及Viterbi算法的应用
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4335810.html 一个例子: 韦小宝使用骰子进行游戏,他有两种骰子一种正常的骰子,还有一 ...
- HMM:隐马尔科夫模型-前向算法
http://blog.csdn.net/pipisorry/article/details/50722376 目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算 ...
- HMM:隐马尔科夫模型-维特比算法
http://blog.csdn.net/pipisorry/article/details/50731584 目标-解决HMM的基本问题之二:给定观察序列O=O1,O2,-OT以及模型λ,如何选择一 ...
- 隐马尔可夫模型(HMM)及Viterbi算法
HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引 ...
- Viterbi算法和隐马尔可夫模型(HMM)算法
隐马尔可夫模型(HMM)及Viterbi算法 https://www.cnblogs.com/jclian91/p/9954878.html HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那 ...
- 隐马尔可夫模型(HMM)及Viterbi算法
HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...
- 隐马尔科夫模型(HMM)的概念
定义隐马尔科夫模型可以用一个三元组(π,A,B)来定义:π 表示初始状态概率的向量A =(aij)(隐藏状态的)转移矩阵 P(Xit|Xj(t-1)) t-1时刻是j而t时刻是i的概率B =(bij) ...
- 隐马尔科夫模型(hidden Markov Model)
万事开头难啊,刚开头确实不知道该怎么写才能比较有水平,这篇博客可能会比较长,隐马尔科夫模型将会从以下几个方面进行叙述:1 隐马尔科夫模型的概率计算法 2 隐马尔科夫模型的学习算法 3 隐马尔科夫模型 ...
- 隐马尔科夫模型(Hidden Markov Models)
链接汇总 http://www.csie.ntnu.edu.tw/~u91029/HiddenMarkovModel.html 演算法笔记 http://read.pudn.com/downloads ...
随机推荐
- 当ABB机器人外部轴驱动器过流维修
一.过流故障原因分析 电机负载异常 当ABB机器人外部轴驱动器所承受的负载超过其额定值时,电机需要产生更大的转矩以维持运行,从而导致电流增大.例如,在一些自动化生产线上,如果外部轴需要搬运的物品重量突 ...
- MySQL - [04] 分布式部署&主从复制&读写分离
一.前言 Q1:为什么需要主从复制? 1.在业务复杂的系统中,有一条SQL语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务.使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁 ...
- maven - [02] settings.xml配置
maven处理配置的优先级顺序 (1)全局settings.xml(优先级★☆☆☆☆) 位于Maven安装目录的conf/settings.xml,提供系统级的默认配置,比如本地仓库位置.远程仓库列表 ...
- Flink学习(十五) 滑动事件时间窗口加上水位线开始窗口时间如何确定?(底层源码)
先看上一节的代码程序 package com.wyh.windowsApi import org.apache.flink.streaming.api.TimeCharacteristic impor ...
- LangChain大模型框架& Dify低代码 AI 开发平台
目录 1. LangChain介绍 1.1 架构 1.2 概念 1.3 术语 1.4 LangChain实战 2. LLM 应用开发平台dify 2.1 dify安装 2.2 设置知识库 3. dif ...
- .netCore 使用 Quartz 实例
一.参考源文链接 1.https://www.likecs.com/show-897836.html 2.https://blog.csdn.net/weixin_43614067/article/d ...
- 前缀函数和 KMP "跳步骤"模式匹配
在一篇由字符构成的长文中查找另一个短字符串出现的位置,这可以算是编程领域最最常见的问题(比如按下 Ctrl + F 就可以打开你浏览器的查找功能).这个问题叫做字符串的模式匹配,我们把被查找的关键词叫 ...
- Windows 10 的 "邮件" 设置完成QQ账户,提示您的Qq帐户设置已过期的处置方法
引起这问题的原因可能是QQ未开启 1.POP3/SMTP服务 2.IMAP/SMTP服务 开启方法: 1.登录QQ邮箱(mail.qq.com) 2.点击"设置"->&q ...
- 【前端JSP思考】JSP中#{},${}和%{}的区别
JSP中#{},${}和%{}的区别: #{} #{}:对语句进行预编译,此语句解析的是占位符?,可以防止SQL注入, 比如打印出来的语句 select * from table where id=? ...
- sql数据库连接
前言 作为数据存储的数据库,近年来发展飞快,在早期的程序自我存储到后面的独立出中间件服务,再到集群,不可谓不快了.早期的sql数据库一枝独秀,到后面的Nosql,还有azure安全,五花八门,教人学不 ...