HMM - (补充) 参数求解之 F/B 算法细节

回顾

上篇通过EM算法思想来求解 HMM 的参数 \(\theta=(\pi, A,B)\) 即 初始状态概率(向量), 状态转移概率(矩阵), 发射概率矩阵. 在上帝视角, 即已知隐变量 Z , 则通过简单的词频统计, 再归一化 就求解参数了.

而问题在于我们不是上帝, 只能通过观测值 X , 通过 F/B 算法 来求解出 Z, 即:

\(p(z_k|x) = \frac {p(z_k, x)}{p(x)}\) 这是求解目标

这里的 x 表示所有的 n 个样本嘛, 因此为了和 F, B 产生联系, 可以将 x 进行划分 (展开).

Forward: \(p(z_k | x_{1...k})\)

Backward: \(p(x_{k_1...n} | z_k)\)

\(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})\)

条件概率: P(a, b) = P(a)P(b|a) = P(b) P(a|b)

可以省略掉 \(x_{1...k}\) 考虑条件独立的情况下, 其对条件概率是没有影响的, 参考: D-separation性质

\(=p(z_k, x_{1...k}) \ p(x_{k+1...n} | z_k)\) 最核心公式

框架搭建起来了, 然而如何去求解这个公式, 还没有搞好, 于是这篇就来整一波计算 F/B 的细节.

Forward 算法求解

\(X: x_1, x_2, x_3, ...x_n\) 每个观测是一个向量哦

\(Z : z_1, z_2, ...z_k ..z_n\) 每个隐变量是一个值

$Z \rightarrow X $ 发射概率矩阵

\(Z \rightarrow Z\) 转移概率矩阵

需求: \(p(z_k, x_{1...k})\) 这个 概率值 (注: \(z_k\) 是个标量, \(x_{1..k}\) 是个向量)

要求解这个问题, 还是要用 动态规划 , 即把大的问题, 不断拆解为更小的问题来求解, 最直观的拆解, 即:

\(p(z_k, x_{1...k}) \ 拆解为: \ p(z_{k-1}, x_{1..k-1})\)

在动态规划的框架下呢,

相当于 \(p(z_k, x_{1...k}) = 某式子 * p(z_{k-1}, x_{1...k-1})\)

因为, 这是它的子问题. 怎么做呢, 嗯首先, 观察一波右边, 看哪些变量是没有出现在左边的, 比如 \(x_{1...k-1}\) 其实是包含在左边式子中的, 而 \(z_{k-1}\) 是没有出现在左边式子的.

即我们要想办法, 将左边的式子, 称为有包含右边的 \(z_{k-1}\) 项的, 方式就是求和, 如果是连续型, 就进行积分 呀.

\(p(z_k, x_{1...k}) = \sum \limits _{z_{k-1}} p(z_{k-1}, z_k, x_{1...k})\)

注意 \(\sum\) 的下标是 \(z_{k-1}\) 跟前面对 X 进行分段是有类似的思想

然后, 后面的工作就是要将这个式子, 如何转换为 \(某式子 * p(z_{k-1}, x_{1...k-1})\) 的形式. 同上一样, 对 X 进行拆分:

\(=\sum \limits _{z_{k-1}} p(z_{k-1}, z_k, \ x_{1...k-1}, \ x_k)\)

\(=\sum \limits _{z_{k-1}} p(z_{k-1}, x_{1...k-1}) \ p(z_k | z_{k-1}, x_{1...k-1}) \ p(x_k | z_k, z_{k-1}, x_{1...k-1})\)

就是利用联合概率公式 P(a, b, c) = P(a) P(b|a) P(c|a, b) 注意是有向的哈, 根据之前的有向图是一样的.

这里来仔细分析一波这个求和里面的 公式:

  • \(p(z_{k-1)}, x_{1...k-1})\) 是咱要的 子问题
  • \(p(z_k|z_{k-1}, x_{1...k-1})\) 如果不考虑 \(x_{1...k-1}\) 则变为 \(p(z_k | z_{k-1})\) 就是咱熟悉的 状态转移矩阵
  • \(p(x_k | z_k, z_{k-1}, x_{1...k-1} )\) 如果不考虑 \(z_k, x_{1...k-1}\) 则变为 \(p(x_k | z_k)\) 就是咱熟悉的 发射概率矩阵

从上篇已经知道了, 在模型已经的情况下, 是很容易计算 发射概率和状态转移的, 因此, 我们现在又要来考虑, 上面 如果不考虑的变量, 是否对咱的条件概率产生影响. 判断是方式依然是 D-separation 规则:

  • 对于 \(p(z_k|z_{k-1}, x_{1...k-1})\) 涉及的元素, \(x_{1...k-1}, z_{k-1}, z_k\) 恰好是满足" tail to tail " 因此 \(x_{1...k-1}\) 不影响结果
  • 对于 \(p(x_k | z_k, z_{k-1}, x_{1...k-1})\) 涉及, \(x_{1...k-1}, z_{k-1}, z_k, x_k\) 这恰好是"tail to head"因此 \(x_{1...k-1}, z_{k-1}\)不影响结果

\(p(z_k, x_{1...k}) = \sum \limits _{z_{k-1}} p(z_{k-1}, x_{1...k-1}) \ p(z_k | z_{k-1}) p(x_k | z_k)\)

后两项是状态转移矩阵 和 发射概率矩阵, 知道模型参数下, 是非常容易计算的, 现就关注:

类似EM算法的 E 步, 计算的时候, 也可手工初始化一个值来进项不断迭代计算的

\(p(z_{k-1}, x_{1...k-1})\) 这个就是典型的 动态规划 了.

如果把上边 \(p(z_k, x_{1...k})\) 看为是 \(\alpha_k(z_k)\) , 则 \(p(z_{k-1}, x_{1...k-1})\) 就是 \(\alpha_{k-1} (z_{k-1})\) .... 这样的一个动态过程, 其复杂度是 \(O(n*m^2)\)

动态规划的思想是, 将大的问题拆解为子问题, 即把之前的计算的过程保存下来, 再反复使用哦.

Backward 算法求解

前边的 Froward 算法是用来计算 \(p(z_k | x_{1...k})\) 的概率值.

此处 Backward 算法则是来计算 \(p(x_{k+1...n} | z_k)\) 的概率值.

求解思路也是一样的, 不过要注意这里是 backward 即是从后面往前, 进行子问题拆分, 即:

\(p(x_{k+1...n} | z_k) = 某个项 * p(x_{k+1...}| z_{k+1})\)

\(=\sum \limits _{z_{k+1}} p(x_{k+2...n}, x_{k+1}, z_{k+1} |z_k)\)

同上一样的拆分方法 即 P(a, b, c) = P(a) P(b|a) P(c|a, b)

\(=\sum \limits _{z_{k+1}}p(z_{k+1}|z_k) \ p(x_{k+1}|z_{k+1}, z_k) p(x_{k+2...n} |z_{k+1}, z_k, x_{k+1})\)

同样用 D-separation 的性质来进行 判断看是否能无关变量

\(=\sum \limits _{z_{k+1}} p(x_{k+2...n} |z_{k+1}) \ p(x_{k+1}|z_{k+1}) \ p(z_{k+1}|z_k)\)

得到跟之前一样的形式, 即这3项分别为: 子问题, 发射概率, 转移矩阵

然后同样对子问题: \(p(x_{k+2..n}|z_{k+1})\) 进行动态规划求解.

至此, 我们已经能知道, 在已知 X 的前提下, 对任意状态 Z_k 是可以求解的, 即 \(p(z_k|x)\) , Forward * Backward 核心思想还是 EM算法呀. 这样对于 HMM 算法的参数求解, 针对已知 X, Z 直接统计即可; 在知道 X, 不知 Z 的情况下, 通过 EM 算法求解即可, 核心技巧是 F/B 算法, 而本篇对 F/B 算法的细节也做了推导, 其核心还是 发射概率, 状态转移还有动态规划求解, 至此, HMM 算是稍微明白了许多.

原文地址:https://www.cnblogs.com/chenjieyouge/p/12121832.html

时间: 2024-10-06 00:23:07

HMM - (补充) 参数求解之 F/B 算法细节的相关文章

文本主题模型之LDA(二) LDA求解之Gibbs采样算法

本文是LDA主题模型的第二篇,读这一篇之前建议先读文本主题模型之LDA(一) LDA基础,同时由于使用了基于MCMC的Gibbs采样算法,如果你对MCMC和Gibbs采样不熟悉,建议阅读之前写的MCMC系列MCMC(四)Gibbs采样. 1. Gibbs采样算法求解LDA的思路 首先,回顾LDA的模型图如下: 在Gibbs采样算法求解LDA的方法中,我们的α,ηα,η是已知的先验输入,我们的目标是得到各个zdn,wknzdn,wkn对应的整体z? ,w? z→,w→的概率分布,即文档主题的分布和

flink 批量梯度下降算法线性回归参数求解(Linear Regression with BGD(batch gradient descent) )

1.线性回归 假设线性函数如下: 假设我们有10个样本x1,y1),(x2,y2).....(x10,y10),求解目标就是根据多个样本求解theta0和theta1的最优值. 什么样的θ最好的呢?最能反映这些样本数据之间的规律呢? 为了解决这个问题,我们需要引入误差分析预测值与真实值之间的误差为最小. 2.梯度下降算法 梯度下降的场景: 梯度下降法的基本思想可以类比为一个下山的过程.假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷). 但此时山上的浓雾很

模糊PID控温算法的具体实现(一):参数自整定模糊PID算法概念

上个学期已经基本上实现了PID的温控算法,为了撰写小论文,这个学期最先要做的事情就是实现模糊PID的温控算法. 模糊控制系统的构成与与常规的反馈控制系统的主要区别在于控制器主要是由模糊化,模糊推理机和精确化三个功能模块和知识库(包括数据库和规则库)构成的.具体实现过程如下所示: (1)预处理: 输入数据往往是通过测量设备测量得到的一个具体数据,预处理就是在它们进入控制器前对这些数据进行分类,或性质程度的定义.预处理过程也是量化过程,它是在离散空间中把输入数据划分为若干个数字级别.例如,假设一个反

那些有关求解next数组的算法

next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strlen(mainStr) = m,则其时间复杂度为O(mn). 为了能够得到更有效的匹配算法,D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达

【Algorithms IV】求解强连通分量 Kosaraju算法

[Algorithms IV]求解强连通分量 Kosaraju算法 Kosaraju算法(也被称为Kosaraju–Sharir算法)是一个在线性时间内寻找一个有向图中的强连通分量的算法. 这个拗口的名字来自他的作者,但是查不到他的生平.应该是个印度人. 求解问题:要求有向图中的强连通分量的个数/划分 算法步骤: 即: 对输入G, 反转边获得逆向图GR     用DFS算法对图遍历得到reversePost序列(遍历图后push 到一个stack里,之后stack逆序弹出) 依次对reverse

多相机颜色校正算法之一---基于LM算法的颜色变换参数求解

问题背景 在多视角视频系统中,会用多个相机拍摄同一个场景.但是因为不同相机之间的特性参数不一样,会产生色彩一致性(color consistency)和色感一致性(color constancy)的问题.由于色感是人的主观感受,不易进行量化比较.所以这里只解决色彩不一致性的问题. 如下图所示,左右两张图片就出现色彩不一致的问题. 颜色校正模型 相机有很多固有参数,这些参数会影响到拍摄到的画面呈现出的色彩.其中主要影响的有三个元素. 求解出Gain, offset,gamma三个参数,就可得到校准

LDA variational inference note, LDA 参数求解

1.LDA主题模型 给定先验概率参数αβ,主题混合参数θ,集合主题z,集合词w的联合分布为            (1) 2.variational inference 1>variational distribution variational inference algorithm 介绍的variational 分布:                                (3) 是作为后验概率p(θ, z, w | α, β)的代替.variational分布的参数γ和φ通过求解最

C# 二元一次方程参数求解

本文记录了关于求直线斜率及纵截距值的简单方法,只是简单的记录下求解思路,最终还需根据具体项目进行优化. 设直线方程式为:y=kx+b 编程思想: 1.代入y1与x1的值,得到:y1=kx1+b 2.代入y2与x2的值,得到:y2=kx2+b 3.首先算出一个系数m=kx1 / kx2 或 m=kx2 / kx1 4.根据第三步,将 y1=kx1+b 或 y2=kx2+b 乘以系数m,使 kx1==kx2 ,注意 kx1与kx2不能为0 4.将2个函数相减,例如:my2-my1=mb-b 即 m(

依据对象元素的某个参数对List进行排序算法

在java开发中,我们经常会遇到一些问题需要对数据进行排序处理,那么在list集合的使用中,怎样根据集合中的对象的某个参数为参照进行集合的排序呢? 今天为大家分享一个比较愚笨的排序方式: 每个list集合的数据都会是一个类对象,在每个类对象中都会有若干个变量存在.那么我们就以对象中的变量为参照,进行排序. 首先,将需要参照的类变量取出,存放在一个可以进行元素大小比较的数组中,这里我用到long数组.请参考代码: ArrayList<Order> orders = new ArrayList&l