概率计算问题
隐马尔可夫模型
假设有三个盒子,分别都装着红球和黑球。第一个盒子里有五个红球五个黑球,第二个盒子里有四个红球六个黑球,第三个盒子里装着七个红球三个黑球
现在给出隐马尔可夫模型的参数
A是概率转移矩阵
B是观测概率矩阵
Π是初始概率矩阵
设T为3,O=(黑,白,黑)
用前向算法计算P(O | γ)
import numpy as np
A=np.array([[0.5,0.2,0.3],[0.3,0.5,0.2],[0.2,0.3,0.5]])
B=np.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]])
p=np.array([0.2,0.4,0.4])
O=np.array([0,1,0])#观测序列
a0=p[0]*B[0][O[0]]#计算初值
b0=p[1]*B[1][O[0]]
c0=p[2]*B[2][O[0]]
forward=np.array([a0,b0,c0])
for i in range(1,len(O)):
forward=forward@A#矩阵的矢量积
for j in range (B.shape[0]):
forward[j]=forward[j]*B[j][O[i]]
print(forward )
print(forward.sum())
P(O | γ)=0.130218
用后向算法计算P(O | γ)
import numpy as np
A=np.array([[0.5,0.2,0.3],[0.3,0.5,0.2],[0.2,0.3,0.5]])
B=np.array([[0.5,0.5],[0.4,0.6],[0.7,0.3]])
p=np.array([[0.2],[0.4],[0.4]])
O=np.array([0,1,0])#观测序列
a0=1#计算初值
b0=1
c0=1
backward=np.array([[a0],[b0],[c0]])
print(backward)
for i in range(len(O)-1,0,-1):
B0=np.array([B[0][O[i]],B[1][O[i]],B[2][O[i]]])
backward=A*B0@backward
print(backward)
B0=np.array([[B[0][O[0]]],[B[1][O[0]]],[B[2][O[0]]]])
result=p*backward*B0
print(result)
print(result.sum())
P(O | γ)=0.130218