认识

跟 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算法求解 隐变量的更多相关文章

  1. 隐马尔可夫模型及Viterbi算法

    隐马尔可夫模型(HMM,hidden Markov model)是可用于标注问题的统计学模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型.HMM模型主要用于语音识别,自然语言处理,生物 ...

  2. 隐马尔科夫模型及Viterbi算法的应用

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4335810.html 一个例子: 韦小宝使用骰子进行游戏,他有两种骰子一种正常的骰子,还有一 ...

  3. HMM:隐马尔科夫模型-前向算法

    http://blog.csdn.net/pipisorry/article/details/50722376 目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算 ...

  4. HMM:隐马尔科夫模型-维特比算法

    http://blog.csdn.net/pipisorry/article/details/50731584 目标-解决HMM的基本问题之二:给定观察序列O=O1,O2,-OT以及模型λ,如何选择一 ...

  5. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑.   本文将通过具体形象的例子来引 ...

  6. Viterbi算法和隐马尔可夫模型(HMM)算法

    隐马尔可夫模型(HMM)及Viterbi算法 https://www.cnblogs.com/jclian91/p/9954878.html HMM简介   对于算法爱好者来说,隐马尔可夫模型的大名那 ...

  7. 隐马尔可夫模型(HMM)及Viterbi算法

    HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...

  8. 隐马尔科夫模型(HMM)的概念

    定义隐马尔科夫模型可以用一个三元组(π,A,B)来定义:π 表示初始状态概率的向量A =(aij)(隐藏状态的)转移矩阵 P(Xit|Xj(t-1)) t-1时刻是j而t时刻是i的概率B =(bij) ...

  9. 隐马尔科夫模型(hidden Markov Model)

    万事开头难啊,刚开头确实不知道该怎么写才能比较有水平,这篇博客可能会比较长,隐马尔科夫模型将会从以下几个方面进行叙述:1 隐马尔科夫模型的概率计算法  2 隐马尔科夫模型的学习算法 3 隐马尔科夫模型 ...

  10. 隐马尔科夫模型(Hidden Markov Models)

    链接汇总 http://www.csie.ntnu.edu.tw/~u91029/HiddenMarkovModel.html 演算法笔记 http://read.pudn.com/downloads ...

随机推荐

  1. [Ynoi2016] 镜中的昆虫 题解

    难度在最近遇到的题里相对较高,在这里写一篇珂学题解. (以下是学校给的部分分) \(20\%\):直接暴力枚举. 另外 \(20\%\):假如我们取 \(pre\),对于 \(pre<l\) 的 ...

  2. Arduino函数库和程序架构

    Arduino程序的架构大体可分为3个部分. (1)声明变量及接口的名称. (2)setup().在Arduino程序运行时首先要调用setup()函数,用于初始化变量.设置针脚的输出/输入类型.配置 ...

  3. mysql数据库表如何设计

    单表数据量 所有表都需要添加注释,数据量建议控制在3000万以内 不保存大字段数据 不在数据库中存储图片.文件等大数据 表使用规范 拆分大字段和访问频率低的字段,分离冷热数据 单表字段数控制在 20 ...

  4. python基础-数据类型、字典、集合、文件操作(打开、关闭、读写、追加等)

    前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...

  5. 全面的C#/.NET/.NET Core面试宝典(永久免费)

    前言 C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺.扩充知识面和大家共同学习.携手进步. 该知识库主要由自己平时学习和工作实践总结.网上优秀文章资料 ...

  6. pandas 判断列是否包含某个字符串

    亲测第二种好用 in 语句 不包含使用not in food = df['日期'].values.tolist() if '休息' in food: print(food) if df['共计小时'] ...

  7. Qt 实现带阴影 无边框的QMessageBox

    Qt 实现带阴影的QMessagebox 在实际项目里面使用到了QMessageBox做一个弹窗,最开始是样式不是需要的样式,就去找了一下QMessageBox的样式表,一般来说可以使用findChi ...

  8. rust学习笔记(8)

    cargo cargo是一个用来帮助控制项目开发的工具 cargo.toml 这是一个用来管理项目的文件 首先是[package]部分 [package] name = "foo" ...

  9. Java 设计模式:装饰者模式(Decorator Pattern)

    一.模式定义 装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式.该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭). 二.核心角色 Co ...

  10. 解决PyCharm提示Error: Please select a valid Python interpreter

    前言 Pycharm运行Python3.7.8的程序时发现源程序运行报错(非语法错误) Error:please select a valid Python interpreter 解决 第一步:打开 ...