首页 > 代码库 > 隐马尔科夫模型
隐马尔科夫模型
模型定义
隐马尔科夫模型定义如下:$$\lambda = (Q,V,A,B,\pi);$$
I是长度为T的状态序列:$I=(i_1,i_2,...,i_T)$;
O是对应的观测序列: $O = (o_1,o_2,...,o_t)$;
其中:
1) Q为状态的集合:$Q={q_1,q_2,...,q_N}$, N为状态的数量;
2) V为观测的集合:$V={v1,v2,...,v_M}$,M为观测的数量;
3) A为状态转移概率矩阵:$A=[a_{(i,j)}] (1<=i,j <= N)$,$a_{(i,j)}=P(i_{t+1}=q_j|i_t=q_i)$表示在t时刻处于状态$q_i$的条件下t+1时刻转移到$q_j$的概率;
4) B为观测生成概率矩阵:$B=[b_{(j,k)}] (1<=j <= N, 1<= k <=M)$, $b_{(j,k)}=P(o_t=v_k|i_t=q_j)$表示在t时刻处于状态$q_j$的条件下生成观测$v_k$的概率;
5) $\pi$是初试概率向量:$\pi =(\pi ) (1<=i <= N)$, $\pi_i=P(i_1=q_i)$表示t=1时处于状态$q_i$的概率。
只要上述的五个参数确定了一个马尔科夫模型。
假设前提
隐马尔科夫模型作了两个基本的假设:
1) 其次马尔科夫假设:任意时刻t的状态只依赖于其前一刻的状态,与观测和其他时刻的状态无关,即:$$P(i_t|t_{t-1},o_{t-1},..,i_1,o_1)=P(i_t|i_{t-1}), t=1,2,..,T;$$
2) 观测独立性假设: 任意时刻的观测值只依赖于该时刻的状态,与观测和其他时刻的状态无关,即:$$P(o_t|i_t,o_T,..,i_1,o_1)=P(o_t|i_t)$$
下面是一个例子,希望能通过这个例子理解什么是状态,什么是观测,只有把这两个概念理清楚了,才能理解下去,不然真是一团乱麻。
赌场的欺诈(示例)
某赌场在掷骰子根据点数决定胜负时 , 采取暗中作弊的手段,连续多次使用正常骰子A后,偶尔使用一个灌铅骰子 B,骰子A的6个字码出现的概率是相等的,而骰子B的6个字码出现的概率是不相等,甚至某个字码出现的概率为0,这样在使用骰子B时,老板可以大赚一笔。
下面是两个骰子的各个字码出现的概率分布:
字码 | 骰子A | 骰子B |
1点 | 1/6 | 0 |
2点 | 1/6 | 1/8 |
3点 | 1/6 | 1/8 |
4点 | 1/6 | 3/16 |
5点 | 1/6 | 3/16 |
6点 | 1/6 | 3/8 |
另外假设,骰子使用的概率如下:
再设第一次挣骰子一定使用骰子A,即初始概率向量为:$\pi={1,0}$。
于是赌场骰子的隐马尔科夫模型如下:
状态集合:Q={骰子A,骰子B};
观测集合:V={1,2,3,4,5,6};
状态转移矩阵:A={{0.9,0.1},
{0.8,0.2}};
生成概率矩阵:B={{1/6,1/6,1/6,1/6,1/6,1/6},
{0,1/8,1/8,3/16,3/16,3/8}};
可以描述为如下图:
实际上,状态应该叫隐状态,即状态时不可见的,我们可见的是观测,就好比医生给病人看病,医生不能直接看到病人的内部器官哪里出了毛病,但是看病人的舌头、肤色等能够得到一些观测数据,即通过观察来推测内部状态。上例中状态是骰子的类别,观测是挣骰子得到的字码。
隐马尔科夫模型的三个问题
1) 概率计算问题: 给定模型$\lambda = (Q,V,A,B,\pi)$和观测序列$O=(o_1,o_2,...,o_T)$,计算在模型$\lambda$下观察序列O出现的概率$P(O|\lambda)$; 比如对于上述示例,骰子挣出的点数序列记录为:124552646214614613613666166466163661636616361651561511514612356234,问这个序列出现的概率为多少?
2) 学习问题: 已知观测序列$O=(o_1,o_2,...,o_T)$,估计模型$\lambda = (Q,V,A,B,\pi)$的参数,使得该模型下观测序列概率$P(O|\lambda)$最大;比如骰子挣出的点数序列记录为:124552646214614613613666166466163661636616361651561511514612356234,求初始概率向量$\pi$,状态转移矩阵A,观测生成概率矩阵B。
3) 预测问题(解码问题): 已经模型$\lambda = (Q,V,A,B,\pi)$和观测序列$O=(o_1,o_2,...,o_T)$,求最可能的对应的观测序列。比如骰子挣出的点数序列记录为:124552646214614613613666166466163661636616361651561511514612356234,求哪些点数是用骰子B挣出的?
概率计算问题
直接计算观测序列的概率计算复杂度很高,可以采用动态规划来加速求解,有两个求解方法:前向算法、后向算法。
前向算法
根据隐马尔科夫模型的假设,时刻t+1的观测只依赖于t+1时刻的状态,而t+1时刻的状态又只依赖于t时刻的状态,因此从直观上来说,我们就可以先求出观测序列$o_1,o_2,..o_t$的概率,再求$o_1,o_2,..o_t,o_{t+1}$的概率,最终求得$o_1,o_2,..o_T$的概率,即$P(O|\lambda)$。
定义前向概率:前t时刻部分的为$o_1,o_2,..o_t$且t时刻状态为$q_i$的概率,记为:$$\alpha(t,i)=P(o_1,o_2,...,o_t,i_t=q_i|\lambda)$$
1) 初始化:$$\alpha(1,i)=\pi_ib(i,o_1), i=1,2,..,N$$
2) 递推:对T=1,2,...,T-1,$$\alpha(t+1,i)=[\sum_{j=1}^N\alpha(t,j)a(j,i)]b(i,o_{i+1}), i=1,2,...,N$$
3) 终止:$$P(O|\lambda)=\sum_{i=1}^N\alpha(T,i)$$
解释一下递推公式,$\alpha(t+1,i)=P(o_1,o_2,...,o_{t+1},i_t+1=q_i|\lambda)$要求t+1时刻的状态是$q_i$并且观测是$o_{t+1}$,首先t+1时刻的状态$q_i$可能是t时刻的任意一种状态转移过来的,因此对前t时刻的前向概率乘以对应的转移概率并累加,最后乘以$b(i,o_{i+1})$是t+1时状态$q_i$生成观测$o_{i+1}$的概率。
为了说明计算过程,我们用一个长度为3的观测序列O=(124)来演示前向计算的过程。
后向算法
前向算法是从前往后递推计算,而后向算法则相反,从后往前计算。
定义后向概率:在时刻t状态为$q_i$的条件下,从t+1到T时刻部分观测序列为(o_{t+1},o_{t+2},..o_T)的概率,记作:$$\beta(t,i) = P((o_{t+1},o_{t+2},..o_T|i_t=q_i,\lambda);
1) 初始化:$$\belta(T,i)=1, i=1,2,...,N;
2) 递推:对t=T-1,T-2,..,1 $$\beta(t,i)=\sum_{j=1}^Na(i,j)b(j,o_{i+1})\beta(t+1,j), i=1,2,..,N$$
3) 终止:$$P(O|\lambda)=\sum_{i=1}^N\pi_ib(i,o_1)\beta(1,i)$$
隐马尔科夫模型