注:该算法即根据观测序列求产生该观测序列的概率
"""HMM model forward algorithm"""
import numpy as np
def possibility(observe):
"""calculate"""
# 假设有三种状态s1,s2,s3定义一个状态转化矩阵
state_transform = np.array([[0.5, 0.3, 0.2],
[0.2, 0.5, 0.3],
[0.3, 0.2, 0.5]])
# 定义一个观测概率矩阵,每个状态会产生0,1值
state_transform_observe = np.array([[0.3, 0.7],
[0.5, 0.5],
[0.6, 0.4]])
# 定义一个初始化变量矩阵
initial_transform = np.array([0.5, 0.3, 0.2])
# 初始化第一个观测值的可能性
alpha_t = initial_transform * state_transform_observe[:, observe[0]]
for i in range(1, len(observe)):
state_t = np.dot(alpha_t, state_transform)
observe_transform = state_transform_observe[:, observe[i]]
alpha_t = state_t * observe_transform
return np.sum(alpha_t)
if __name__ == '__main__':
observe_line = [0, 0, 1, 1, 1]
print('序列为:' + observe_line.__str__() + '的概率为', possibility(observe_line))