1 import numpy as np
2 # -*- codeing:utf-8 -*-
3 __author__ = 'youfei'
4
5 # 隐状态
6 hidden_state = ['sunny', 'rainy']
7
8 # 观测序列
9 obsevition = ['walk', 'shop', 'clean']
10
11
12 # 根据观测序列、发射概率、状态转移矩阵、发射概率
13 # 返回最佳路径
14 def compute(obs, states, start_p, trans_p, emit_p):
15 # max_p(3*2)每一列存储第一列不同隐状态的最大概率
16 max_p = np.zeros((len(obs), len(states)))
17
18 # path(2*3)每一行存储上max_p对应列的路径
19 path = np.zeros((len(states), len(obs)))
20
21 # 初始化
22 for i in range(len(states)):
23 max_p[0][i] = start_p[i] * emit_p[i][obs[0]]
24 path[i][0] = i
25
26 for t in range(1, len(obs)):
27 newpath = np.zeros((len(states), len(obs)))
28 for y in range(len(states)):
29 prob = -1
30 for y0 in range(len(states)):
31 nprob = max_p[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]]
32 if nprob > prob:
33 prob = nprob
34 state = y0
35 # 记录路径
36 max_p[t][y] = prob
37 for m in range(t):
38 newpath[y][m] = path[state][m]
39 newpath[y][t] = y
40
41 path = newpath
42
43 max_prob = -1
44 path_state = 0
45 # 返回最大概率的路径
46 for y in range(len(states)):
47 if max_p[len(obs)-1][y] > max_prob:
48 max_prob = max_p[len(obs)-1][y]
49 path_state = y
50
51 return path[path_state]
52
53
54 state_s = [0, 1]
55 obser = [0, 1, 2]
56
57 # 初始状态,测试集中,0.6概率观测序列以sunny开始
58 start_probability = [0.6, 0.4]
59
60 # 转移概率,0.7:sunny下一天sunny的概率
61 transititon_probability = np.array([[0.7, 0.3], [0.4, 0.6]])
62
63 # 发射概率,0.4:sunny在0.4概率下为shop
64 emission_probability = np.array([[0.1, 0.4, 0.5], [0.6, 0.3, 0.1]])
65
66 result = compute(obser, state_s, start_probability, transititon_probability, emission_probability)
67
68 for k in range(len(result)):
69 print(hidden_state[int(result[k])])