#假设又T个时刻,N个隐状态
import numpy as np
def viterbi(A, B, pi, V, Q, obs):
#Q为状态集合,obs为观测序列
T = len(obs)
N = len(Q)
#生成一个T行N列的矩阵作为dp表
dp = np.array([[0]*N]*T, dtype=np.float64)
phi = np.array([[0]*N]*T, dtype=np.float64)
#根据初始概率矩阵初始化第一列
for i in range(N):
dp[0, i] = pi[i]*B[i][V[obs.index(0)]]
phi[0, i] = 0
for i in range(1, T):
for j in range(N):
tmp = [dp[k][i-1] * A[j, k] for k in range(N)]
dp[i, j] = max(tmp) * B[j, V[obs.index(i)]]
phi[i, j] = tmp.index(max(tmp))
#最终概率及节点
P = max(dp[T-1, :])
I = int(np.argmax(dp[T-1, :]))
path = [I]
for i in reversed(range(T)):
end = path[-1]
path.append(phi[i ,end]])
hidden_states = [Q[i] for i in reversed(path)]
return P, hidden_states
11-22
486
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交