-
手推示例
-
Python编程
code:
import numpy as np
class Vertibi():
def __init__(self, A, B, pi):
self.A = A
self.B = B
self.pi = pi
def forward(self):
self.day1 = np.multiply(self.B[0], self.pi)
self.path1 = np.array([0, 0])
self.day2 = np.multiply(np.max(np.multiply(self.day1, self.A), axis=1), self.B[1])
self.path2 = np.argmax(np.multiply(self.day1, self.A), axis=1)
self.day3 = np.multiply(np.max(np.multiply(self.day2, self.A), axis=1), self.B[2])
self.path3 = np.argmax(np.multiply(self.day2, self.A), axis=1)
self.path = np.array([list(self.path1), list(self.path2), list(self.path3)]).T
self.weight = np.array([list(self.day1), list(self.day2), list(self.day3)]).T
return self.weight, self.path
def back_trace(self):
# p_star = np.max(self.day3)
i3_star = np.argmax(self.day3)
i2_star = self.path[i3_star][2]
i1_star = self.path[i2_star][1]
return [i1_star, i2_star, i3_star]
if __name__ == '__main__':
A = [[0.7, 0.4], [0.3, 0.6]]
B = [[0.1, 0.6], [0.4, 0.3], [0.5, 0.1]]
pi = [0.6, 0.4]
state = ['雨天','晴天']
mcmc = Vertibi(A, B, pi)
weight, path = mcmc.forward()
print("---------------------------矩阵--------------------------")
print(weight)
print("\t\t1\t2\t3\t")
print(f"Rainy:{' '.join(str(round(i,2)) for i in weight[0])}")
print(f"Sunny:{' '.join(str(round(i,2)) for i in weight[1])}")
print("----------------------------全部路径--------------------------")
print(path)
print("--------------------------回溯最优路径---------------------------")
print(mcmc.back_trace())
print(f"预测结果是:{' '.join(state[i] for i in mcmc.back_trace())}")