-
介绍
-
HMM在实际应用中主要用来解决3类问题。
1.评估问题(概率计算问题)
即给定观测序列 O=O1O2…Ot和模型参数λ=(A,B,π),怎样有效计算这一观测序列出现的概率P(O|λ)
2.预测问题 (也称解码问题)
即给定观测序列 O=O1O2…Ot和模型参数λ=(A,B,π),怎样寻找满足这种观察序列意义上最优的隐含状态序列S。
3.学习问题。
即HMM的模型参数λ=(A,B,π)未知,如何求出这3个参数以使观测序列O=O1O2…Ot的概率尽可能的大,可以使用极大似然估计参数(EM算法)。
4.个人理解
通过Baum-Welch训练HMM模型,然后输入需要判断的数据通过前向后向算法计算确定属于哪个模型,最后通过viterbi解码隐含状态序列
-
前向算法
-
问题:给定观察值序列O=o1,…,oT以及一个模型λ=(π,A,B ) 时产生出O的概率P(O|λ)?
-
前向向量定义:at(i) = P(o1 o2 …ot,qt=i|λ)
-
前向算法过程如下:
(1)初始化:a1(i) = πibi(O1), 1≤i≤N
(2)递推:
,1≤j≤N,1≤t≤T-1
t+1时刻状态j的概率值为t时刻每一个状态的概率值与其对应转移函数相乘的累积和再与观察值概率相乘
(3)终止:
其中:
-
下面解释这个算法:
该图为初始状态,输出观察值为O1 ,图中显示3个状态对应算法初始化公式,而该序列观察值所得概率为:
P(O1| )= π1b1(O1)+π2b2(O1)+π3b3(O1)=α1(1)+α1(2)+α1(3)
该图为一次递推过程,输出观察值为O1 O2,图中O2对应的状态1的概率是通过O1对应的3个状态通过递推公式求得,该结果为:
P(O1 O2,q2=θ1| )= α1(1)a11b1(O2)+ α1(2)a21b1(O2)+ α1(3)a31b1(O3)
以此类推可以得到P(o1 o2 …ot|λ)
-
前向算法计算P(O|M)过程:
step1: α1(1) =π1b1(red)=0.2*0.5=0.1
α1(2)=π2b2(red)==0.4*0.4=0.16
α1(3)=π3b3(red)==0.4*0.7=0.21
step2:α2(1)=α1(1)a11b1(white)+α1(2)a21b1(white)+α1(3)a31b1(white)
...
step3:P(O|M) = α4(1)+α4(2)+α4(3)
前向算法实现代码参考此链接: