HMM——三个基本问题的计算
宇宙公主有金银铜三个首饰盒。金首饰盒里有两件红宝石、一件蓝宝石,一件珍珠首饰和一件珊瑚;银首饰盒里有红宝石、珍珠,珊瑚和蓝宝石首饰各一件;铜首饰盒里有珍珠、红宝石和珊瑚首饰各一件。 她准备这样做:把三个首饰盒放在一个轮盘上,随机转动轮盘。停下时,哪个盒子在她眼前,她就从这个首饰盒里随机拿出一件首饰,记录首饰的材质后,把首饰放回原盒中。 宇宙公主将重复上述动作3次,如果3次拿出来的正好依次是红宝石,珍珠和珊瑚,她就赦免月亮公主。 那么请问:月亮公主被赦免的可能性到底有多大呢?
问题分析
我们先来看一下这个问题,按照上面的操作,最终我们希望看到的是一个首饰的观测序列,是:O = (红宝石,珍珠,珊瑚)。 其实,在整个事件中,除了最终的首饰序列之外,还有另一个序列:首饰盒的序列。 首先宇宙公主选了一系列的盒子,然后再从每个盒子里选了一件首饰。如此一来,首饰盒正好对应状态,而首饰则对应观测。首饰盒序列就是状态序列,首饰序列则是观测序列。状态序列的不同状态之间是依据时序一对一跳转的,而某一个时刻的观测值也仅与当时的状态值有关。这种情况下,我们完全可以应用 HMM 来估计 O 出现的概率。 要确定一个 HMM,我们需要两个空间和$\lambda $; 状态空间,也就是状态值的集合是:{金盒子,银盒子,铜盒子}。 观测空间,也就是观测值的集合是:{红宝石,珍珠,珊瑚,蓝宝石}。
λ
=
[
A
,
B
,
π
]
\lambda = [A,B,\pi]
λ = [ A , B , π ]
我们来看看 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]
A = ⎣ ⎡ 0 . 1 0 . 4 0 . 5 0 . 5 0 . 2 0 . 3 0 . 4 0 . 4 0 . 2 ⎦ ⎤ 再看各个盒子里面拿不同材质首饰出来的概率
|红宝石
珍珠
珊瑚
蓝宝石
金
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]
B = ⎣ ⎡ 0 . 4 0 . 2 5 0 . 3 3 0 . 2 0 . 2 5 0 . 3 3 0 . 2 0 . 2 5 0 . 3 3 0 . 2 0 . 2 5 0 ⎦ ⎤ 初始概率分布铜盒子略高,其他两个概率相等
π
=
(
0.3
,
0.3
,
0.4
)
T
\pi = (0.3,0.3,0.4)^T
π = ( 0 . 3 , 0 . 3 , 0 . 4 ) T
概率计算问题
继续上面的例子。现在模型已经给定,观测序列也已经知道了,我们要计算的是 O = (红宝石,珍珠,珊瑚) 的出现概率,我们要求的是
P
(
O
∣
λ
)
P(O|\lambda )
P ( O ∣ λ ) 。
直接计算
用直接计算法来求$\lambda $情况下长度为 T 的观测序列 O 的概率:
P
(
O
∣
λ
)
=
∑
S
∈
S
T
P
(
O
,
S
∣
λ
)
P(O | \lambda)=\sum_{S \in S_{T}} P(O, S | \lambda)
P ( O ∣ λ ) = S ∈ S T ∑ P ( O , S ∣ λ ) 其中
S
T
S_T
S T 表示所有长度为 T 的状态序列的集合,S 为其中一个状态序列。 对所有长度为 T 的状态序列
S
t
S_t
S t 和观测序列 O 求以
λ
\lambda
λ 为条件的联合概率,然后对所有可能的状态序列求和,就得到了
P
(
O
∣
λ
)
P(O|\lambda )
P ( O ∣ λ ) 的值。 因为
P
(
O
,
S
∣
λ
)
=
P
(
O
∣
S
,
λ
)
P
(
S
∣
λ
)
P(O,S|\lambda ) = P(O|S, \lambda)P(S|\lambda)
P ( O , S ∣ λ ) = P ( O ∣ S , λ ) P ( S ∣ λ ) ; 又因为
P
(
O
∣
S
,
λ
)
=
b
11
b
22
.
.
.
b
T
T
P(O|S, \lambda) = b_{11}b_{22}...b_{TT}
P ( O ∣ S , λ ) = b 1 1 b 2 2 . . . b T T ; 而
P
(
S
∣
λ
)
=
π
1
a
12
a
23
.
.
.
a
(
T
−
1
)
T
P(S| \lambda) = \pi_1 a_{12}a_{23}...a_{(T-1)T}
P ( S ∣ λ ) = π 1 a 1 2 a 2 3 . . . a ( T − 1 ) T ,其中
a
i
j
a_{ij}
a i j 为矩阵 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}
P ( O ∣ λ ) = ∑ s 1 , s 2 , . . . , s T π b 1 1 a 1 2 b 2 2 a 2 3 . . . a T − 1 b T T 。 理论上讲,我们可以把所有状态序列都按照上述公式计算一遍,但它的时间复杂度是
O
(
T
N
T
)
O(TN^T)
O ( T N T ) ,计算量太大了,基本上不可行。
前向-后向算法
如果不是直接计算,还有什么办法可以算出一个观测序列出现的概率吗? 当然有,那就是前向-后向算法 。 前向—后向算法是一种动态规划算法。它分两条路径来计算观测序列概率,一条从前向后(前向),另一条从后向前(后向)。这两条路径,都可以分别计算观测序列出现的概率。 在实际应用中,选择其中之一来计算就可以。 所以,前向-后向算法其实也可以被看作两个算法:前向算法和后向算法,它们可以分别用来求解
P
(
O
∣
λ
)
P(O|\lambda)
P ( O ∣ λ ) 。
前向算法
设
α
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 )
α t ( i ) = P ( o 1 , o 2 , . . . , o t , s t = S i ∣ λ ) 为前向概率。 它表示的是:给定
λ
\lambda
λ 的情况下,到时刻t时,已经出现的观测序列为
o
1
,
o
2
,
.
.
.
,
o
t
o_1,o_2,...,o_t
o 1 , o 2 , . . . , o t 且此时状态值为
S
i
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_1,o_2,...,o_t
o 1 , o 2 , . . . , o t 的下标标志是时刻(而非观测空间的元素下标),具体某个
o
i
o_i
o i 的取值才是观测空间中的一项。因此观测序列中很可能出现
o
i
=
o
j
o_i = o_j
o i = o j 的状况。
S
i
S_i
S i 为一个具体的状态值。当前HMM的状态空间一共有N个状态值:
S
1
,
S
2
,
.
.
.
,
S
N
S_1,S_2,...,S_N
S 1 , S 2 , . . . , S N ,
S
i
S_i
S i 是其中的一项。
s
t
s_t
s t 在此处表示t时刻的状态,它的具体取值是
S
i
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
α ( i ) = π 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)
α t + 1 ( i ) = [ ∑ j = 1 N α t ( j ) a i j ] 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
P ( O ∣ λ ) = ∑ i = 1 N α T ( i ) , i = 1 , 2 , . . . , N 如此一来,概率计算问题的计算复杂度就变成了
O
(
N
2
T
)
O(N^2T)
O ( N 2 T )
后向算法
设
β
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 )
β t ( i ) = P ( o t + 1 , o t + 2 , . . . , o T ∣ s t = S i , λ ) 为后向概率。 它表示的是:给定
λ
\lambda
λ 的情况下,到时刻 t 时,状态为
S
i
S_i
S i 的条件下,从 t+1 到 T 时刻出现的观察序列为
o
t
+
1
,
o
t
+
2
,
.
.
.
,
o
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
β T ( i ) = 1 , i = 1 , 2 , . . . , N ——到了最终时刻,无论状态是什么,我们都规定当时的后向概率为1; (2)对
t
=
T
−
1
,
T
−
2
,
.
.
.
,
1
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
β t ( i ) = ∑ j = 1 N a i j b j ( o t + 1 ) β 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 ∣ λ ) = ∑ i = 1 N π i b i ( o 1 ) β 1 ( i ) , i = 1 , 2 , . . . , N 结合前向后向算法,定义
P
(
O
∣
λ
)
P(O|\lambda )
P ( O ∣ λ ) :
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
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