隐马尔可夫前向算法后向算法python实现

隐马尔可夫模型的概率计算问题

概率计算问题

隐马尔可夫模型

有三个盒子,每个盒子都分别装着红球和黑球
假设有三个盒子,分别都装着红球和黑球。第一个盒子里有五个红球五个黑球,第二个盒子里有四个红球六个黑球,第三个盒子里装着七个红球三个黑球

在这里插入图片描述
现在给出隐马尔可夫模型的参数
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
![在这里插入图片描述](https://img-blog.csdnimg.cn/04f2888c237d48ffa832f5a6d676744b.png

用后向算法计算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
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值