import numpy as np
import math
classViterbi:def__init__(self, o, A, B, pi, index, N, M):
self.N = self.B.shape[1]#shape[1]列数
self.M = self.B.shape[0]#shape[0]行数
self.o = o #可观测状态
self.A = A #状态转移概率矩阵
self.B = B #观测概率矩阵
self.pi = pi #初始状态概率
self.index = index #观测状态 下标数
self.T =len(self.o)#观测序列一共有多少值
self.delta =[[0]*self.N]*self.T #delta为局部概率
self.keci =[[0]*self.N]*self.T
self.i =[]#得到的状态序列是#前向计算求最大概率 defcalculate(self):for i inrange(self.N):
self.delta[0][i]= pi[i]*B[i][0]for t inrange(1,self.T):
ot = self.o[t]
ot_index = self.index[ot]for i inrange(self.N):max=0
maxj =0for j inrange(self.N):
p = self.delta[t-1][j]*self.A[j][i]*self.B[i][ot_index]if p >max:max= p
maxj = j
self.delta[t][i]=max
self.keci[t][i]= maxj
defbest_path(self):max=0
maxi =0
path =[]for i inrange(self.N):
p =self.delta[self.T-1][i]if p >max:max= p
maxi =i
path.append(maxi+1)for t inrange(self.T-1,0,-1):
maxi = self.keci[t][maxi]
path.append(maxi+1)for i inrange(len(path)-1,-1,-1):
self.I.append(path[i])print(self.I)if __name__=='__main__':
A = np.array([[0.7,0.3],[0.4,0.6]])
B = np.array([[0.1,0.4,0.5],[0.6,0.3,0.1]])
pi = np.array([0.6,0.4])
o =['walk','shop','clean']
index ={'walk':0,'shop':1,'clean':2}
I =['Rainy','Sunny']