观测序列生成算法
输入:隐马尔可夫模型
λ
=
(
A
,
B
,
π
)
\lambda=(A, B, \pi)
λ=(A,B,π)
输出:观测序列
O
=
(
o
1
,
o
2
,
.
.
.
,
o
T
)
O=(o_1,o_2,...,o_T)
O=(o1,o2,...,oT)
(1)按照初始状态分布
π
\pi
π产生状态
i
1
i_1
i1
(2)令
t
=
1
t=1
t=1
(3)按照状态
i
t
i_t
it的观测概率分布
b
i
t
(
k
)
{b_i}_t(k)
bit(k)生成
o
t
o_t
ot
(4)按照状态
i
t
i_t
it的状态转移概率分布{
a
i
t
i
t
+
1
a_{itit+1}
aitit+1}产生状态
i
t
+
1
,
i
t
+
1
=
1
,
2
,
.
.
.
,
N
i_{t+1},i_{t+1}=1,2,...,N
it+1,it+1=1,2,...,N
(5)令
t
=
t
+
1
t=t+1
t=t+1,如果
t
<
T
t<T
t<T,转步(3),否则,终止。
代码实现
import numpy as np
def hmm_obs_seq(Q, V, A, B, pi, T):
"""
:param Q: 状态集合
:param V: 观测集合
:param A: 状态转移概率矩阵
:param B: 观察概率矩阵
:param pi: 初始概率分布
:param T: 观察序列和状态序列的长度
"""
q_0 = np.random.choice(Q, size=1, p=pi)
o_0 = list(np.random.choice(V, size=1, p=B[Q.index(q_0)]))
o_t = []
o_t.extend(o_0)
for t in range(1, T):
q_t = np.random.choice(Q, size=1, p=A[Q.index(q_0)])
o_t.extend(np.random.choice(V, size=1, p=B[Q.index(q_t)]))
return o_t
# 《统计学习方法》中的例子
Q = [1, 2, 3, 4]
V = ['红', '白']
A = np.array([[0, 1, 0, 0], [0.4, 0, 0.6, 0], [0, 0.4, 0, 0.6], [0, 0, 0.5, 0.5]])
B = np.array([[0.5, 0.5], [0.3, 0.7], [0.6, 0.4], [0.8, 0.2]])
pi = [0.25, 0.25, 0.25, 0.25]
T = 5
print(hmm_obs_seq(Q, V, A, B, pi, T))