李航《统计学习方法》(第二版)习题10.3python实现

题目的条件和习题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]]

猜你喜欢

转载自blog.csdn.net/qq_34924057/article/details/105899654