题目:
解决代码如下:
# A是状态转移概率矩阵,B是观测概率矩阵,pi是初始状态概率向量
import numpy as np
A = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]])
B = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]])
pi = np.array([0.2, 0.4, 0.4])
T, N = 4, 3
# 最终序列
o = ['红', '白', '红', '白']
o_map = {'红': 0, '白': 1}
# 初始化
delta1 = pi * B[:, o_map[o[1-1]]]
psi1 = np.zeros(N)
# 递推 向量化的写法简单,实际上还是按单项掰手指头搞出来的
delta2 = ((A.T * delta1).T * B[:, o_map[o[2-1]]]).max(0)
psi2 = (A.T * delta1).T.argmax(0)
delta3 = ((A.T * delta2).T * B[:, o_map[o[3-1]]]).max(0)
psi3 = (A.T * delta2).T.argmax(0)
delta4 = ((A.T * delta3).T * B[:, o_map[o[4-1]]]).max(0)
psi4 = (A.T * delta3).T.argmax(0)
# 最优路径
p_star = delta4.max()
i4 = delta4.argmax()
i3 = psi4[i4]
i2 = psi3[i3]
i1 = psi2[i2]
# 修正索引的0打头问题,输出
I_star = [i1+1, i2+1, i3+1, i4+1]
print('最优路径:', I_star)
算法思路:
主要运用了动态规划的思想
算法流程图:
根据算法流程图的每一个步骤即可写出实现代码
运行结果如下: