推导过程:
完整代码(还有待改进):
from numpy import *
import numpy as np
class HMM:
def __init__(self):
self.emission_probability=np.array([(0.1,0.4,0.5),(0.6,0.3,0.1)])
self.transition_probability=np.array([(0.7,0.3),(0.4,0.6)])
self.start_probability=np.array([(0.6),(0.4)])
self.out=[1,0,0]
self.t=len(self.out)
self.m=len(self.emission_probability)
self.n=len(self.transition_probability[0])
def viterbi(self):
self.z = array(zeros((self.t, self.m)))
self.d = array(zeros((self.t, self.m)))
for i in range(self.m):
self.z[0][i]=self.start_probability[i]*self.transition_probability[i][self.out[0]]
self.d[0][i]=0
for j in range(1,self.t):
for i in range(self.m):
maxnum=self.z[j-1][0]*self.emission_probability[0][i]
node=1
for k in range(1,self.m):
temp=self.z[j-1][k]*self.emission_probability[k][i]
if(maxnum<temp):
maxnum=temp
node=k+1
self.z[j][i]=maxnum*self.transition_probability[i][self.out[j]]
self.d[j][i]=node
max_probability=self.z[self.t-1][0]
last_node=[1]
temp=0
for i in range(1,self.m):
if(max_probability<self.z[self.t-1][i]):
max_probability=self.z[self.t-1][i]
last_node[0]=i+1
temp=i
i=self.t-1
while(i>=1):
last_node.append(self.d[i][temp])
i=i-1
temp=['o']
temp[0]=int(last_node[len(last_node)-1])
j=len(last_node)-2
while j>=0:
temp.append(int(last_node[j]))
j=j-1
print('1代表晴天,2代表雨天,则路径节点为')
print(temp)
print('该路径概率为'+str(max_probability))
if __name__ == '__main__':
test=HMM()
test.viterbi()
运行结果如图