HMM算法-求观测序列出现的概率
学习HMM的一些简单总结,具体的内容和推导可以去参考《条件随机场理论综述》,写的非常好。
1,离散马尔科夫过程
时间和状态都是离散变量,且当前所处的状态只与它之前的一个状态有关(马尔科夫性),这种随机过程即为马尔科夫过程。
2,HMM的五个要素
HMM可以用一个五元组表示:\(\lambda= (S,K,A,B,\pi) \)。其中S为状态集合,K为观察集合,A为转移矩阵,B为观察概率矩阵,\(\pi\)为初始状态分布。
3,HMM的三个假设
(1)t时刻的状态只依赖于t-1时刻
(2)t时刻的观测值Ot只依赖于t时刻的状态qt
(3)状态与具体时间无关,即转移概率是独立于时间的
4,HMM的三个基本问题
(1)给定模型,如果和求观测序列o1,o2...ot出现的概率\(P(O|\lambda)\)
(2)给定模型和观测序列,如何找到产生这一序列概率最大的状态序列Q
(3)给定模型和观测序列,如何调整模型的参数,使得产生观测序列的概率最大
5,forward-backward算法
本篇文章总结一下如何解决第一个问题?给定一个观测序列o1,o2,o3..ot,它产生的概率是什么?一个最直接的思路就是把所有可能产生这个序列的状态序列穷举出来,这样自然序列o1o2...on的概率也出来了,但是这样做自然是不行的,因为时间复杂度太高了。。那怎么做呢?forward-backford算法,这其实是一种动态规划算法,建立在节点与之前之后节点的关系上。
定义forward变量:
\(\alpha_t(i)=P(O_1O_2O_t,q_t=s_i|\lambda)\)
这是部分观测序列与t时刻状态\(s_i\)的联合分布。如何从\(\alpha_t(i)\)推导出\(\alpha_{t+1}(j)\)呢?
虽然推导的过程很复杂,但是\(\alpha_j(t+1)=[\sum_{i=1}^{N}\alpha_i(t)a_{ij}]b_j(O_{t+1})\)确不难理解。t+1时刻的状态j可以从t时刻的任意状态转移而来,所以就有了前半部分的加和\(\sum_{i=1}^{N}\alpha_i(t)a_{ij}\),然后再乘以第二部分的发射概率\(b_j(O_{t+1})\)。
从而也容易推出整体序列O的概率\(P(O|\lambda)=\sum_{i=1}^{N}\alpha_T(i)\)
类似forward变量的定义,backforward变量\(\beta_i(t)\)定义如下:\(\beta_i(t)=P(O_{t+1}...O_T|q_t=s_i,\lambda)\)。这个是部分序列\(O_{t+1}\)到OT,在t时刻状态为i时的条件概率,还记的吗?forword变量是联合概率。同样,也可以得到\(\beta_i(t)\)与\(\beta_{j}(t+1)\)的关系。
\(P(O|\lambda)\)可以用forward变量和backword变量共同表示:
\(P(O|\lambda) = \sum_{i}^{N}P(q_t=s_i,O|\lambda)\)
而 \(P(q_t=s_i,O|\lambda)=P(O|q_t=s_i,\lambda)P(q_t=s_i|\lambda)\)
\(=P(O_1O_2...O_t...O_T|q_t=s_i,\lambda)P(q_t=s_i|\lambda)\)
\(=P(O_1O_2...O_t|q_t=s_i,\lambda)P(O_{t+1}...O_T|q_t=s_j,\lambda)P(q_t=s_i|\lambda)\)
\(=P(O_1O_2...O_t,q_t=s_j|\lambda)P(O_{t+1}...O_T|q_t=s_j,\lambda)\)
\(=\alpha_i(t)\beta_i(t)\)
所以
\(P(O|\lambda) = \sum_{i}^{N}P(q_t=s_i,O|\lambda)=\sum_{i=1}^{N}\alpha_i(t)\beta_i(t)\)
看来要想求\(P(O|\lambda)\)可以从任何一个t点出发。
实际问题
编程求解