C S D N 真 的 很 过 分 , 换 了 K a t e x 很 多 公 式 都 显 示 不 出 来 了 … … 看 完 整 公 式 请 移 步 \color{red}{优快云真的很过分,换了Katex很多公式都显示不出来了……看完整公式请移步} CSDN真的很过分,换了Katex很多公式都显示不出来了……看完整公式请移步
Baileyswu@github
学习目标:
- 介绍HMM的定义与符号
- 讨论HMM的三个基本问题
- 概率计算问题:前后向算法
- 学习问题:Baum-Welch模型,EM算法计算参数
- 预测问题:Viterbi算法
- 每种算法用代码实现
- 参考李航的《统计学习方法》(在这里吐槽一下HMM那章下标 i i i 乱用,有些算法不是很ok)
基本概念
HMM是一种时序数据模型。
设序列长度为 T T T ,具有观测序列 X ⃗ = { x ⃗ 1 , … , x ⃗ T } \vec X=\{\vec x_1,\dots,\vec x_T\} X={
x1,…,xT} 和隐变量序列 Z ⃗ = { z ⃗ 1 , … , z ⃗ T } \vec Z=\{\vec z_1,\dots,\vec z_T\} Z={
z1,…,zT} 。
这里认为每一个观测都由对应的隐变量生成。隐变量序列是Markov链, z ⃗ t \vec z_t zt只依赖于 z ⃗ t − 1 \vec z_{t-1} zt−1
变量都在有限的状态集里变化,观测的状态集为 S ⃗ = { s ⃗ 1 , … , s ⃗ M } \vec S=\{\vec s_1,\dots,\vec s_M\} S={
s1,…,sM} ,隐变量的状态集为 H ⃗ = { h ⃗ 1 , … , h ⃗ N } \vec H=\{\vec h_1,\dots,\vec h_N\} H={
h1,…,hN} 。
因此 x ⃗ t ∈ S ⃗ , z ⃗ t ∈ H ⃗ , t = 1 , … , T \vec x_t\in \vec S,\vec z_t\in \vec H,t=1,\dots,T xt∈S,zt∈H,t=1,…,T 。
有时需要反向找到某状态是状态集里的第几个,定义 f i n d i n d e x ( z ⃗ t ) = i findindex(\vec z_t)=i findindex(zt)=i ,表示 z ⃗ t = h ⃗ i \vec z_t = \vec h_i zt=hi 。
同理也有 f i n d i n d e x ( x ⃗ t ) = i findindex(\vec x_t)=i findindex(xt)=i ,表示 x ⃗ t = s ⃗ i \vec x_t = \vec s_i xt=si 。
隐状态间的转移矩阵为 A ⃗ = [ a i j ] N × N \vec A=[a_{ij}]_{N\times N} A=[aij]N×N , a i j a_{ij} aij 是从状态 h ⃗ i \vec h_i hi 转移到 h ⃗ j \vec h_j hj 的概率。
从隐状态到观测的发射矩阵 B ⃗ = [ b i j ] N × M \vec B=[b_{ij}]_{N\times M} B=[bij]N×M , b i j b_{ij} bij 是从状态 h ⃗ i \vec h_i hi 转移到观测 s ⃗ j \vec s_j s