仅作为保存,大佬请跳过。
直接上代码
前向算法
from numpy import *
import numpy as np
import matplotlib as plt
import math
def hmm_forward():
A=np.array([[0.5,0.1,0.4],[0.3,0.5,0.2],[0.2,0.2,0.6]])
B=np.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]])
pai=np.array([0.2,0.3,0.5])
o=np.array([0,1,0,0,1,0,1,1])
# 初始化
T=len(o)
boxnumber=shape(B)[0]
alpha=np.zeros(T*boxnumber).reshape(boxnumber,T)
for i in range(boxnumber):
alpha[i][0]=pai[i]*B[i][o[0]]
# 迭代
sigma=0
for j in range(T-1):
for i in range(boxnumber):
for k in range(boxnumber):
sigma+=alpha[k][j]*A[k][i]
alpha[i][j+1]=sigma*B[i][o[j+1]]
sigma=0
# 终止
prob=np.sum(alpha,axis=0)
print(alpha)
print(prob[-1])
if __name__=='__main__':
hmm_forward()
后向算法
from numpy import *
import numpy as np
import matplotlib as plt
import math
def hmm_backward():
A=np.array([[0.5,0.1,0.4],[0.3,0.5,0.2],[0.2,0.2,0.6]])
B=np.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]])
pai=np.array([0.2,0.3,0.5])
o=np.array([0,1,0,0,1,0,1,1])
# 初始化
T=len(o)
boxnumber=shape(B)[0]
beta=np.zeros(T*boxnumber).reshape(boxnumber,T)
for i in range(boxnumber):
beta[i][0]=1
# 迭代
sigma=0
t=T
for j in range(T-1):
t -= 1
for i in range(boxnumber):
for k in range(boxnumber):
sigma+=A[i][k]*B[k][o[t]]*beta[k][j]
beta[i][j+1]=sigma
sigma=0
print(beta)
# 终止
sigma=0
for i in range(boxnumber):
sigma+=pai[i]*B[i][o[0]]*beta[i][T-1]
print(sigma)
if __name__=='__main__':
hmm_backward()
参考
感谢大佬博主文章
隐马尔可夫模型的前向算法和后向算法理解与实现(Python)
——————————————————————————
其他参考(此仅作为博主的收藏,博友们请跳过)