题目的条件和习题10.1一样,要求使用维特比算法纠结最优路径*I**
使用python编写执行维特比算法的程函数,输入为观测序列和模型参数,输出为最优路径和出现此最优路径的概率。
‘’’
input:
A: 状态转移概率矩阵
B: 观测概率矩阵
pai: 初始状态概率向量
O: 观测序列
T: 观测序列的个数
N: 状态序列的个数
output:
i_star: 最优路径
P_star: 最优路径的概率
‘’’
维特比算法:
def vitebi(A, B, pai, O, T, N):
o = np.zeros(T, np.int)
a = []
i_star = np.zeros(T, np.int)
# 初始化
delta = np.zeros((T, N))
psi = np.zeros((T, N), np.int)
for i in range(T):
if O[i] == '红':
o[i] = 0
else:
o[i] = 1
for i in range(N):
delta[0][i] = pai[i] * B[i][o[0]]
psi[0][i] = 0
# 递推
for t in range(T-1):
t = t + 1
for i in range(N):
for j in range(N):
a.append(delta[t-1][j] * A[j][i])
delta[t][i] = np.max(a) * B[i][o[t]]
psi[t][i] = np.argmax(a, axis=0)
a = []
psi = psi + 1
# print(delta)
# print(psi)
# 终止
P_star = np.max(delta[T-1])
i_star[T-1] = np.argmax(delta[T-1], axis=0) +1
# 最优路径回溯
for t in range(T-1):
t = T - t - 2
a = t + 1
b = i_star[t+1]-1
# print(b)
i_star[t] = psi[a][b]
return i_star, P_star
已知条件如下:
T = 4
N = 3
O = ['红', '白', '红', '白']
A = [[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]]
B = [[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]]
p_i = [0.2, 0.4, 0.4]
输入已知条件到函数中,并输出结果:
I, P = vitebi(A, B, p_i, O, T, N)
print('最优路径: ')
print(I)
print('最优路径的概率:')
print(P)
得到的结果为:
最优路径:
[3 2 2 2]
最优路径的概率:
0.0030239999999999993
其中δ和ψ的值分别是:
delta:
[[0.1 0.16 0.28 ]
[0.028 0.0504 0.042 ]
[0.00756 0.01008 0.0147 ]
[0.00189 0.003024 0.002205]]
psi:
[[1 1 1]
[3 3 3]
[2 2 3]
[1 2 3]]