HMM的学习

2023-11-08

20201012 -

0. 引言

在学习《异常点检测》这本书的时候,在第十章的内容“离散数据的异常检测”记录中,涉及到隐马尔可夫模型(HMM)的学习,本篇文章具体记录HMM的学习过程。因为《异常点检测》书中关于这部分内容过于简短,本文主要学习文章[1]作为参考。

1. HMM概述

马尔可夫过程是一个随机过程,其未来状态和过去的状态有关,其中一阶的马尔可夫过程仅仅和上一时间的状态有关,如果状态空间是离散空间,该过程可以被称为马尔可夫链。
P ( X n + 1 = x ∣ X 1 = x 1 , X 2 , = x 2 , . . . , X n = x n ) = P ( X n + 1 = x ∣ X n = x n ) P(X_{n+1}=x|X_1=x_1,X_2,=x_2,...,X_n=x_n)=P(X_{n+1}=x|X_n=x_n) P(Xn+1=xX1=x1,X2,=x2,...,Xn=xn)=P(Xn+1=xXn=xn)
关于马尔可夫过程可以用矩阵来模拟其状态转移矩阵,该部分后续专门来研究,包括其一些平稳性的属性和其他的一些利用线性代数来解决其状态的内容。

对于一些实际的问题中,我们能够拥有一些观测值,但是却无法知晓内部的状态,也就是说存在一个潜在的变量或者说隐变量,举一个不是很恰当但是很像的例子,之前GMM模型中的内容,我们能够看到实际的观测值,但是我们不知道每个样本属于哪个高斯分布。这种包含隐藏状态的模型就是HMM。

那么对于HMM来说,在原始的马尔科夫过程的基础上,还包含了一个发射概率(emission probabilities),该概率表示基于某个内部状态,其出现某个观测值的可能性。那么总而言之,HMM将包含两个矩阵,一个是内部的状态转移矩阵,另一个是状态的观测值发射矩阵。
在HMM中,两个假设非常关键,下一个内部状态和当前的观测值仅仅依赖当前的内部状态,利用公式来描述,如下所示。
P ( x i ∣ x 1 , x 2 , . . . , x i − 1 ) = P ( x i ∣ x x − 1 ) P ( o i ∣ x i , x 2 , . . . , x i − 1 ) = P ( o i ∣ x i ) P(x_i|x_1,x_2,...,x_{i-1})=P(x_i|x_{x-1})\\ P(o_i|x_i,x_2,...,x_{i-1})=P(o_i|x_i) P(xix1,x2,...,xi1)=P(xixx1)P(oixi,x2,...,xi1)=P(oixi)
结合前面所说,正是这两个条件概率:内部状态的转移概率,外在观测值的概率;而完整的HMM就是这两个概率,再加上一个初始概率 π \pi π。通常来讲,HMM一般有三个应用方向:

  • 似然概率(likelihood),给定观测值和当前模型的参数,计算出该观测值序列的概率
  • 解码(decoding),给定观测值和当前模型参数,找出内部状态序列
  • 学习,训练HMM,并找出参数。

下面的内容就专门来讲解这几个应用。

2. HMM的应用

2.1 求解某序列值发生的似然概率

(最近一直在看该部分的理论推导,就是为什么要使用这种前向算法,一些文章中都没有具体说明,或者说非常简短,甚至于就是一句话,啊, 这个东西的计算度复杂。但这也是好事,就是我通过自己的学习把全概率公式,乘法公式,以及乘法公式都复习了一遍,虽然这东西都是基础,但是重新要自己的推导的时候,还是不是那么简单的。)
那么我按照我最近学习到的东西,仔细来捋一捋具体的内容。
首先再次明确HMM的两个性质,马尔可夫假设与观测值输出独立性。
I n t e r n a l S t a t e : P ( q i ∣ q 1 . . . q i − 1 ) = P ( q i ∣ q i − 1 ) O u t p u t I n d e p e n d e n c e : P ( o i ∣ q 1 , . . . , q i , . . . , q T , o 1 , . . . , o i , . . . , o T ) = P ( o i ∣ q i ) Internal \quad State:P(q_i|q_1...q_{i-1})=P(q_i|q_{i-1})\\ Output \quad Independence: P(o_i|q_1,...,q_i,...,q_T,o_1,...,o_i,...,o_T)=P(o_i|q_i) InternalState:P(qiq1...qi1)=P(qiqi1)OutputIndependence:P(oiq1,...,qi,...,qT,o1,...,oi,...,oT)=P(oiqi)
来看一下某个事件发生的概率,其中 Y Y Y代表某个序列值, X X X代表内部状态。
P ( Y ) = ∑ x P ( Y , X ) = ∑ x P ( Y ∣ X ) P ( X ) P(Y)=\sum_x P(Y,X)=\sum_x P(Y|X)P(X) P(Y)=xP(Y,X)=xP(YX)P(X)
上述式子中,右边第一个是边缘分布律,通过遍历所有的内部状态空间 X X X,这个就是全概率公式,通过遍历整个状态空间来进行计算,注意,这里的全部状态必须能够填充事件 X X X的全部空间,而最后一个式子是乘法公式。那么如果要计算某个序列值的概率,可以通过遍历当前隐藏状态的所有状态来进行计算。但是这里还是存在这整个序列,依然是不好计算的。
P ( y 1 , y 2 , . . . , y t ∣ λ ) = ∑ j P ( y 1 , y 2 , . . . , y t , x t = s j ∣ λ ) P(y_1,y_2,...,y_t|\lambda)=\sum_j P(y_1,y_2,...,y_t,x_t=s_j|\lambda) P(y1,y2,...,ytλ)=jP(y1,y2,...,yt,xt=sjλ)
那么假设,我知道所有的观测序列 O O O和状态序列 Q Q Q,那么他们的状态值是多少呢?看下下面的公式。
P ( O , Q ) = P ( O ∣ Q ) × P ( Q ) = ∏ i = 1 T P ( o i ∣ q i ) × ∏ i = 1 T P ( q i ∣ q i − 1 ) P(O,Q)=P(O|Q)\times P(Q)=\prod_{i=1}^{T}P(o_i|q_i)\times\prod_{i=1}^{T}P(q_i|q_{i-1}) P(O,Q)=P(OQ)×P(Q)=i=1TP(oiqi)×i=1TP(qiqi1)
上述公式就是简单利用了乘法公式和隐马尔可夫模型的特性来生成上述概率公式,因为这里他是一个连续的独立事件,可以通过乘法公式来进行展开,然后叠乘起来。但实际情况是,在估计观测值的时候,并知道具体的内部状态,仅仅有观测值。那么依然使用全概率公式。
P ( O ) = ∑ Q P ( O , Q ) = ∑ Q P ( O ∣ Q ) P ( Q ) P(O)=\sum_{Q} P(O,Q)=\sum_{Q}P(O|Q)P(Q) P(O)=QP(O,Q)=QP(OQ)P(Q)
但是这种计算方式的话,需要计算全部的概率,也就是需要把所有的内部状态进行全排列,然后逐个利用前面的公式来进行计算,那么计算的隐藏序列个数将达到 N T N^T NT个,这个量级是无法接受的。既然这样的话,那么可以利用前向算法或者后向算法的方式采用动态编程的思想来进行计算。
计算的方式就是,通过遍历前一个时间点的所有隐藏状态,然后利用叠加的方式计算计算出来现在每个隐藏状态的概率值,然后乘上此时的发射概率,来看一个比较形象的图片,该图片来自文章[2]
在这里插入图片描述
那么从公式的角度应该怎么写呢?
P ( O t ) = ∑ i P ( O t , Q t = s i ) = ∑ i P ( O t ∣ Q t = s i ) P ( Q t = s i ) = ∑ i P ( O t ∣ Q t = s i ) ∑ j P ( Q t = s i , Q t − 1 = s j ) = ∑ i P ( O t ∣ Q t = s i ) ∑ j P ( Q t = s i ∣ Q t − 1 = s j ) P ( Q t − 1 = s j ) P(O_t)=\sum_iP(O_t, Q_t=s_i)=\sum_i P(O_t|Q_t=s_i)P(Q_t=s_i)\\ =\sum_iP(O_t|Q_t=s_i)\sum_j P(Q_t=s_i,Q_{t-1}=s_j)\\ =\sum_iP(O_t|Q_t=s_i)\sum_j P(Q_t=s_i|Q_{t-1}=s_j)P(Q_{t-1}=s_j) P(Ot)=iP(Ot,Qt=si)=iP(OtQt=si)P(Qt=si)=iP(OtQt=si)jP(Qt=si,Qt1=sj)=iP(OtQt=si)jP(Qt=siQt1=sj)P(Qt1=sj)
上述公式是没错的,就是最后落实到了这个隐藏状态的概率上,但是怎么用递归的方式来表达出来呢?
(很多文章这里都是直接使用了递归公式,直接就是令这个东西得什么,虽然能知道这是正确的,但是没办法理解这个思考的过程)
那么既然这里我希望通过使用递归的方式,甚至于后面能够使用动态规划的思想来实现,那么必须能够写出来递归方程才行,要求解的内容是 P ( O 1 : t ) = ∑ i P ( O 1 : t , Q t = s i ) P(O_{1:t})=\sum_i P(O_{1:t},Q_t=s_i) P(O1:t)=iP(O1:t,Qt=si)
这里出现了这个公式,那么我能不能推导出来 P ( O 1 : t − 1 ) P(O_{1:t-1}) P(O1:t1)或者 P ( O 1 : t − 1 , Q t − 1 = s i ) P(O_{1:t-1},Q_{t-1}=s_i) P(O1:t1,Qt1=si),也就是说他们是相同的方式呢?他们在整体的表现形式上是一样的。那么利用前向算法的思想。
P ( O 1 : t , Q t = s i ) = X X X P ( O 1 : t − 1 , Q t − 1 = s j ) P(O_{1:t},Q_t=s_i)=XXXP(O_{1:t-1},Q_{t-1}=s_j) P(O1:t,Qt=si)=XXXP(O1:t1,Qt1=sj)
这里的 X X X XXX XXX是一个未知的内容,那么应该怎么写出来,下面来尝试推导一下。
P ( O t , Q t = s i ) = P ( O 1 : t − 1 , O t , Q t = s i ) = P ( O t ∣ O 1 : t − 1 , Q t = s i ) P ( O 1 : t − 1 , Q t = s i ) = P ( O t ∣ Q t = s i ) P ( O 1 : t − 1 , Q t = s i ) = P ( O t ∣ Q t = s i ) ∑ j P ( O 1 : t − 1 , Q t = s i , Q t − 1 = s j ) = P ( O t ∣ Q t = s i ) ∑ j P ( O 1 : t − 1 , Q t − 1 = s j ) P ( Q t = s i ∣ O 1 : t − 1 , Q t − 1 = s j ) = P ( O t ∣ Q t = s i ) ∑ j P ( O 1 : t − 1 , Q t − 1 = s j ) P ( Q t = s i ∣ Q t − 1 = s j ) P(O_t,Q_t=s_i)=P(O_{1:t-1},O_t,Q_t=s_i)=\\ P(O_t|O_{1:t-1},Q_t=s_i)P(O_{1:t-1},Q_t=s_i)=\\ P(O_t|Q_t=s_i)P(O_{1:t-1},Q_t=s_i)=\\ P(O_t|Q_t=s_i)\sum_j P(O_{1:t-1},Q_t=s_i,Q_{t-1}=s_j)=\\ P(O_t|Q_t=s_i)\sum_j P(O_{1:t-1},Q_{t-1}=s_j)P(Q_t=s_i|O_{1:t-1},Q_{t-1}=s_j)=\\ P(O_t|Q_t=s_i)\sum_j P(O_{1:t-1},Q_{t-1}=s_j)P(Q_t=s_i|Q_{t-1}=s_j) P(Ot,Qt=si)=P(O1:t1,Ot,Qt=si)=P(OtO1:t1,Qt=si)P(O1:t1,Qt=si)=P(OtQt=si)P(O1:t1,Qt=si)=P(OtQt=si)jP(O1:t1,Qt=si,Qt1=sj)=P(OtQt=si)jP(O1:t1,Qt1=sj)P(Qt=siO1:t1,Qt1=sj)=P(OtQt=si)jP(O1:t1,Qt1=sj)P(Qt=siQt1=sj)
上述推导过程中,主要使用了全概率公式和乘法公式,同时结合HMM的性质得到。
a i j a_{ij} aij表示状态转移矩阵,而 b j b_j bj表示观测值的发射矩阵,那么改写上述公式。
α t ( i ) = P ( O 1 : t , Q t = s i ) α t ( i ) = b i ( Q t ) ∑ j a j i α t − 1 ( j ) \alpha_t(i)=P(O_{1:t},Q_t=s_i)\\ \alpha_t(i)=b_i(Q_t)\sum_j a_{ji}\alpha_{t-1}(j) αt(i)=P(O1:t,Qt=si)αt(i)=bi(Qt)jajiαt1(j)
那么整体的计算过程如下:
I n i t i a l i z e : α 1 ( j ) = π j b j ( Q 1 ) E a c h S t e p : α t ( j ) = ∑ i = 1 N α t − 1 ( i ) a i j b j ( y t ) F i n a l R e s u l t : P ( Y a l l ∣ λ ) = ∑ i = 1 N α T ( i ) Initialize: \qquad\alpha_1(j)=\pi_jb_j(Q_1)\\ Each Step:\qquad \alpha_t(j)=\sum_{i=1}^{N}\alpha_{t-1}(i)a_{ij}b_{j}(y_t)\\ Final Result:\qquad P(Y_{all}|\lambda)=\sum_{i=1}^{N}\alpha_T(i) Initialize:α1(j)=πjbj(Q1)EachStep:αt(j)=i=1Nαt1(i)aijbj(yt)FinalResult:P(Yallλ)=i=1NαT(i)
通过动态规划的方式,父问题利用子问题的解,然后得到最终的结果。
在很多文章中,都是直接利用了相应的结论,直接写出了递归的方程,这种方式并不是很好理解,一般通过自己推导出来的过程,记忆会更深刻。

2.2 求解最大概率的内部状态序列

从公式上来看,解码过程的公式跟求解似然概率的过程很像。仅仅是一个累加符号变成了max符号。但是我觉得,主要还是要思考这个过程中各个点是怎么样的关系来串联起来的。就是一个关联思考的过程,前面的地方是一种利用边缘概率或者说全概率公式将所有的情况都涵盖起来,然后计算出来,这里呢?目前来看我比较关注的一个点就是,这种仅仅max的方式,是不是有点像贪心算法?!每次仅仅选择最大的。
这部分首先参考了文章[3],在一开始思考这部分问题的时候,就有点想不通为什么要用max这个操作呢?其实我觉得,他文章中的一段话阐述的非常好。我这里直接引用过来。

Like Baum-Welch algorithm, our training algorithm, the Viterbi algorithm is also a dynamic programming approach. As a reminder, the dynamic programming is an approach that you would reuse calculated result in the next calculation, and the act of reusing saves time! What’s more, it is indeed a natural choice for HMM, take the simple HMM as an example, in which any state depends on its first previous state. This statement, however, does not mean that there is no effect at all from the rest of the previous states to the current one, but their effects are all absorbed into the first previous state, and this first previous state becomes the only factor you need to consider when transiting to the next state.

来说一下其所传达的意思,虽然在公式中,某个内部状态仅仅和其前一内部状态有关,但是因为这里是要对整个序列进行预测,那么这就是一个联合概率,联合概率必然是要利用乘法的方式,你把整个所有的内部状态都进行一下内部状态的叠乘的过程。而max的过程,就是在前面的基础上,每次都选最大的,最后才会使整个内部状态序列最大的,其实,如果不加这个max的内容,假设你就是想得到某个内部状态序列的概率值,也是通过乘法公式的方式来实现。现在为了更好的理解。现在就需要把这部分的推导公式找出来,正如之前讲解的前向算法一样,他的完整概率推导公式是什么样子。
(我个人觉得,这部分内容,还是需要好好的思考,能够把这个公式计算的过程完全理解,而且我觉得,阅读这个东西的过程中,越来越觉得其实本质上需要思考这个动态规划的具体细节内容)

参考

[1]Machine Learning — Hidden Markov Model (HMM)
[2]隐马尔可夫模型(三)——隐马尔可夫模型的评估问题(前向算法)
[3]Viterbi algorithm for prediction with HMM — Part 3 of the HMM series

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HMM的学习 的相关文章

随机推荐

  • 深拷贝浅拷贝的理解

    深拷贝 1 是指拷贝一个对象时 不仅仅把对象的引用进行复制 还把该对象引用的值也一起拷贝 2 源对象与拷贝对象互相独立 其中任何一个对象的改动都不会对另外一个对象造成影响 浅拷贝 1 指的是拷贝一个对象时 仅仅拷贝对象的引用进行拷贝 但是拷
  • “由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从...

    WCF程序中一般出现这样的错误 我们需要在服务端的web config中增加
  • 操作系统与shell

    操作系统与shell 操作系统与shell 一 什么是操作系统 1 什么是kernel 2 什么是shell 二 System Call 补充 用户态与内核态 操作系统与shell 一 什么是操作系统 操作系统 即Operating Sys
  • 一文读懂类加载机制

    类记载过程 多个java文件经过编译打包生成可运行的jar包 最终由java命令运行某个主类的main函数启动程序 这里首先需要通过类加载器把主类加载到jvm 主类在运行过程中如果使用到其他类 会逐步加载这些类 注意 jar包里的类不是一次
  • aws ec2 变更pem_用aws和jira建立一个连续的变更日志

    aws ec2 变更pem So you ve decided to go CI CD You read all about the org changes understand the ins and outs of the develo
  • Qt 如何实现文件类型关联

    何为文件打开关联 比如 一个扩展名为txt的文本 双击之后会调用 notepad exe 进行打开 doc的扩展名会调用word打开等等 咱们今天讲的是如何在Qt所编写的程序实现这个动作 这个关联动作都是记录在注册表中的 1 文件格式注册
  • Matlab函数之ismember,find

    一 ismember函数 1 ismember a b 返回前者是否存在于后者的logical数组 举例 a 1 2 3 4 5 6 b 3 5 6 ismember a b 返回的数组为 0 0 1 0 1 1 ismember b a
  • openldap2.4版本管理员文档中文翻译版

    OpenLDAP2 4管理员指南 文章目录 1 OpenLDAP介绍 2 快速开始指南 1 获得软件 2 解压压缩包 3 阅读文档 4 运行configure 5 编译软件 6 测试编译结果 7 安装软件 8 编辑配置文件 9 导入数据库配
  • 计算机网络 第4章 网络层

    第4章 网络层 网络层 network layer 负责为分组交换网上的不同主机提供通信 在发送数据时 将运输层产生的报文段或用户数据报封装成分组或包进行传送 在TCP IP体系中 分组也叫做IP数据包 或简称为数据报 4 1 网络层的几个
  • 透视投影矩阵的推导

    视锥体 如图 近截面与远截面之间构成的这个四棱台就是视锥体 而透视投影矩阵的任务就是把位于视锥体内的物体的顶点X Y Z坐标映射到 1 1 范围 这就相当于把这个四棱台扭曲变形成一个立方体 这个立方体叫做规则观察体 Canonical Vi
  • 如何在visio中画虚线框以及如何解决将visio图形复制到word文档中虚线变为实线的问题

    这两个问题都不是什么复杂的事情 但是如果对visio用的不多或者只是临时用起来碰到了这种问题还真是麻烦事儿 问题1 如何在visio中画虚线框 在上方的按钮中找到矩形工具那个按钮 对 点一下就可以在作图区画出来一个矩形了 可是这个矩形默认的
  • Ubuntu20.04部署GitLab

    安装 更新本地包 安装相关依赖 sudo apt update sudo apt install ca certificates curl openssh server postfix 安装postfix 邮件服务器 时可能出现激活gitl
  • 【开发工具】配置环境变量

    配置环境变量目录 一 环境变量的作用 二 环境变量的配置 一 环境变量的作用 当系统运行一个程序时 除了在当前目录下面寻找此程序外 还会到环境变量中的指定路径寻找 所以将程序的路径设置到环境变量 可以让程序在计算机的任意位置都可以运行 二
  • set-ExecutionPolicy‘ 不是内部或外部命令,也不是可运行的程序 或批处理文

    set ExecutionPolicy 不是内部或外部命令 也不是可运行的程序 或批处理文 1 打开Windows PowerShell ISE 在搜索框内搜索windows powershell ise 然后右击以管理员身份运行 2 输入
  • 315-Leetcode 希尔排序

    希尔排序也叫缩小增量 算法描述 希尔排序是间隔式的分组 5 3 1 利用直接插入排序进行排序 通过缩小分组 排序 再分组 再排序 直到缩为1组 完全有序为止 一趟希尔排序 gap为组数 间隔 分为5组 间隔数就是5 分为3组 间隔数就是3
  • sqlServer 常用查询语句

    查询语句 select 字段 from 表名 where 条件 select 字段 from 表名 where 字段 like 值 select distinct 字段 from 表名 排序查询 select 字段 from 表名 wher
  • 金山卫士开源软件之旅(九) KUI高级界面(列表控件、树控件例子、超文本、网页控件)

    转载自 http blog csdn net b2b160 article details 6275839 reply 注意 作者的例子及代码是基与上一版本的金山库 XML的语法及有些API名字不一样 本篇开始介绍比较复杂的界面应用了 界面
  • MySQL -- 获取某一字段数据的后几位! (SUBSTRING)

    select SUBSTRING id 3 from user 取id字段后三位字符 select SUBSTRING id 3 from user 从左开始第3位取 包括第三位
  • 文本标注平台 doccano 安装教程

    doccano简介 doccano 是一个开源的文本注释工具 它为文本分类 序列标记和序列到序列任务提供注释功能 因此 可以为情感分析 命名实体识别 文本摘要等创建标记数据 只需创建一个项目 上传数据并开始注释 安装 本文是基于window
  • HMM的学习

    20201012 0 引言 在学习 异常点检测 这本书的时候 在第十章的内容 离散数据的异常检测 记录中 涉及到隐马尔可夫模型 HMM 的学习 本篇文章具体记录HMM的学习过程 因为 异常点检测 书中关于这部分内容过于简短 本文主要学习文章