算法强化 —— HMM模型(二)

HMM——三个基本问题的计算

宇宙公主有金银铜三个首饰盒。金首饰盒里有两件红宝石、一件蓝宝石,一件珍珠首饰和一件珊瑚;银首饰盒里有红宝石、珍珠,珊瑚和蓝宝石首饰各一件;铜首饰盒里有珍珠、红宝石和珊瑚首饰各一件。
她准备这样做:把三个首饰盒放在一个轮盘上,随机转动轮盘。停下时,哪个盒子在她眼前,她就从这个首饰盒里随机拿出一件首饰,记录首饰的材质后,把首饰放回原盒中。
宇宙公主将重复上述动作3次,如果3次拿出来的正好依次是红宝石,珍珠和珊瑚,她就赦免月亮公主。
那么请问:月亮公主被赦免的可能性到底有多大呢?

问题分析

我们先来看一下这个问题,按照上面的操作,最终我们希望看到的是一个首饰的观测序列,是:O = (红宝石,珍珠,珊瑚)。
其实,在整个事件中,除了最终的首饰序列之外,还有另一个序列:首饰盒的序列。
首先宇宙公主选了一系列的盒子,然后再从每个盒子里选了一件首饰。如此一来,首饰盒正好对应状态,而首饰则对应观测。首饰盒序列就是状态序列,首饰序列则是观测序列。状态序列的不同状态之间是依据时序一对一跳转的,而某一个时刻的观测值也仅与当时的状态值有关。这种情况下,我们完全可以应用 HMM 来估计 O 出现的概率。
要确定一个 HMM,我们需要两个空间和$\lambda $;
状态空间,也就是状态值的集合是:{金盒子,银盒子,铜盒子}。
观测空间,也就是观测值的集合是:{红宝石,珍珠,珊瑚,蓝宝石}。
λ = [ A , B , π ] \lambda = [A,B,\pi]

我们来看看 A、B 和分别是什么。

A 是状态转移矩阵,A 中元素用来反映不同状态之间的跳转概率。
我们现在设定的场景是“轮盘赌”,也就是说一个轮盘随机旋转。如果每一次停留的位置都是随机的,那么任意一个状态到下面任意一个状态的概率都应该是0.33。但是为了我们的例子更加清晰,我们假设:这个轮盘是不均衡的。
当前盒子为金时,下一次转到银盒子的概率是0.5,铜盒子为0.4,还是金盒子为0.1;当前为银盒子,则下一轮转到金盒子或者铜盒子的概率都是0.4,还是银盒子的概率为0.2;当前为铜盒子,下一个盒子为金银铜的概率分别为0.5、0.3、0.2。
那么我们用一个表格来反应概率跳转(每一行表示一个当前状态,每一列表示一个下一时刻的状态)

|金
0.1 0.5
0.4 0.2
0.5 0.3

我们把金银铜改成数字,分别代表行号和列号:

|1 2 3
1 0.1 0.5
2 0.4 0.2
3 0.5 0.3

这就是状态转移矩阵
A = [ 0.1 0.5 0.4 0.4 0.2 0.4 0.5 0.3 0.2 ] A = \left[\begin{array}{ccc} 0.1 & 0.5 & 0.4 \\ 0.4 & 0.2 & 0.4 \\ 0.5 & 0.3 & 0.2 \end{array}\right]
再看各个盒子里面拿不同材质首饰出来的概率

|红宝石 珍珠 珊瑚 蓝宝石
0.4 0.2 0.2
0.25 0.25 0.25
0.33 0.33 0.33

对应观测矩阵
B = [ 0.4 0.2 0.2 0.2 0.25 0.25 0.25 0.25 0.33 0.33 0.33 0 ] B = \left[\begin{array}{ccc} 0.4 & 0.2 & 0.2 & 0.2\\ 0.25 & 0.25 & 0.25 & 0.25\\ 0.33 & 0.33 & 0.33 & 0 \end{array}\right]
初始概率分布铜盒子略高,其他两个概率相等 π = ( 0.3 , 0.3 , 0.4 ) T \pi = (0.3,0.3,0.4)^T

概率计算问题

继续上面的例子。现在模型已经给定,观测序列也已经知道了,我们要计算的是 O = (红宝石,珍珠,珊瑚) 的出现概率,我们要求的是 P ( O λ ) P(O|\lambda )

直接计算

用直接计算法来求$\lambda $情况下长度为 T 的观测序列 O 的概率:
P ( O λ ) = S S T P ( O , S λ ) P(O | \lambda)=\sum_{S \in S_{T}} P(O, S | \lambda)
其中 S T S_T 表示所有长度为 T 的状态序列的集合,S 为其中一个状态序列。
对所有长度为 T 的状态序列 S t S_t 和观测序列 O 求以 λ \lambda 为条件的联合概率,然后对所有可能的状态序列求和,就得到了 P ( O λ ) P(O|\lambda ) 的值。
因为 P ( O , S λ ) = P ( O S , λ ) P ( S λ ) P(O,S|\lambda ) = P(O|S, \lambda)P(S|\lambda)
又因为 P ( O S , λ ) = b 11 b 22 . . . b T T P(O|S, \lambda) = b_{11}b_{22}...b_{TT}
P ( S λ ) = π 1 a 12 a 23 . . . a ( T 1 ) T P(S| \lambda) = \pi_1 a_{12}a_{23}...a_{(T-1)T} ,其中 a i j a_{ij} 为矩阵 A 中的元素;
所以 P ( O λ ) = s 1 , s 2 , . . . , s T π b 11 a 12 b 22 a 23 . . . a T 1 b T T P(O|\lambda) = \sum_{s_1,s_2,...,s_T}\pi b_{11} a_{12} b_{22} a_{23}...a_{T-1} b_{TT}
理论上讲,我们可以把所有状态序列都按照上述公式计算一遍,但它的时间复杂度是 O ( T N T ) O(TN^T) ,计算量太大了,基本上不可行。

前向-后向算法

如果不是直接计算,还有什么办法可以算出一个观测序列出现的概率吗?
当然有,那就是前向-后向算法
前向—后向算法是一种动态规划算法。它分两条路径来计算观测序列概率,一条从前向后(前向),另一条从后向前(后向)。这两条路径,都可以分别计算观测序列出现的概率。
在实际应用中,选择其中之一来计算就可以。
所以,前向-后向算法其实也可以被看作两个算法:前向算法和后向算法,它们可以分别用来求解 P ( O λ ) P(O|\lambda)

前向算法

α t ( i ) = P ( o 1 , o 2 , . . . , o t , s t = S i λ ) \alpha_t(i) = P(o_1,o_2,...,o_t,s_t = S_i|\lambda ) 为前向概率。
它表示的是:给定 λ \lambda 的情况下,到时刻t时,已经出现的观测序列为 o 1 , o 2 , . . . , o t o_1,o_2,...,o_t 且此时状态值为 S i S_i 的概率。此处写法有点 Confusing,这里具体解释一下。
现在是t时刻,到此刻为止,我们获得的观测序列是( o 1 , o 2 , . . . , o t o_1,o_2,...,o_t ),这些 o 1 , o 2 , . . . , o t o_1,o_2,...,o_t 的下标标志是时刻(而非观测空间的元素下标),具体某个 o i o_i 的取值才是观测空间中的一项。因此观测序列中很可能出现 o i = o j o_i = o_j 的状况。 S i S_i 为一个具体的状态值。当前HMM的状态空间一共有N个状态值: S 1 , S 2 , . . . , S N S_1,S_2,...,S_N S i S_i 是其中的一项。
s t s_t 在此处表示t时刻的状态,它的具体取值是 S i S_i
因此有:
(1) α ( i ) = π i b i ( o 1 ) , i = 1 , 2 , . . . , N \alpha(i) = \pi_i b_i(o_1),i = 1,2,...,N
(2)递推,对于t = 1,2,…,T-1,有 α t + 1 ( i ) = [ j = 1 N α t ( j ) a i j ] b i ( o t + 1 , i = 1 , 2 , . . . , N ) \alpha_{t+1}(i) = [\sum_{j=1}^N \alpha_t(j)a_{ij}]b_i(o_{t+1},i = 1,2,...,N)
(3)最终 P ( O λ ) = i = 1 N α T ( i ) , i = 1 , 2 , . . . , N P(O|\lambda) = \sum_{i=1}^N \alpha_T(i),i = 1,2,...,N
如此一来,概率计算问题的计算复杂度就变成了 O ( N 2 T ) O(N^2T)

后向算法

β t ( i ) = P ( o t + 1 , o t + 2 , . . . , o T s t = S i , λ ) \beta_t(i) = P(o_{t+1},o_{t+2},...,o_T|s_t = S_i,\lambda ) 为后向概率。
它表示的是:给定 λ \lambda 的情况下,到时刻 t 时,状态为 S i S_i 的条件下,从 t+1 到 T 时刻出现的观察序列为 o t + 1 , o t + 2 , . . . , o T o_{t+1},o_{t+2},...,o_T 的概率。
(1) β T ( i ) = 1 , i = 1 , 2 , . . . , N \beta _T(i) = 1,i = 1,2,...,N ——到了最终时刻,无论状态是什么,我们都规定当时的后向概率为1;
(2)对 t = T 1 , T 2 , . . . , 1 t = T-1,T-2,...,1 ,有 β t ( i ) = j = 1 N a i j b j ( o t + 1 ) β t + 1 ( j ) , i = 1 , 2 , . . . , N \beta_t(i) = \sum_{j = 1}^N a_{ij} b_j(o_t+1) \beta_{t+1}(j),i = 1,2,...,N
(3) P ( O λ ) = i = 1 N π i b i ( o 1 ) β 1 ( i ) , i = 1 , 2 , . . . , N P(O| \lambda ) = \sum_{i = 1}^N \pi_i b_i(o_1) \beta_1(i),i = 1,2,...,N
结合前向后向算法,定义 P ( O λ ) P(O|\lambda )
P ( O λ ) = i = 1 N j = 1 N α t ( i ) a i j b j ( o t + 1 ) β t + 1 ( j ) , t = 1 , 2 , . . . , T 1 P(O|\lambda ) = \sum_{i = 1}^N \sum_{j =1}^N \alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j),t = 1,2,...,T-1

发布了110 篇原创文章 · 获赞 3 · 访问量 4091

猜你喜欢

转载自blog.csdn.net/qq_33357094/article/details/105019316