码迷,mamicode.com
首页 > 其他好文 > 详细

HMM_概率计算——forwar_algorithm实现

时间:2018-10-29 21:28:17      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:def   lambda   前向算法   alpha   代码   统计学习   学习方法   image   sha   

一、前向算法(递推)

  1)观测概率初值

     技术分享图片

  2)递推

      技术分享图片

  3)终止

      技术分享图片

二、理解前向算法

哈哈,先欠着,没时间码字!

三、代码实现:

 1 def getPro():
 2     iniStatePro=[]   #初始状态概率分布列表
 3     pi=np.array(iniStatePro)
 4     
 5     stateTransPro=[]           #状态转移概率矩阵  N x N 
 6     A=np.array(stateTransPro)  # A[a][b]: 状态a -> 状态b 的概率
 7     
 8     observationPro=[]          #观测概率矩阵     N x M 
 9     B=np.array(observationPro) # B[a][o]:状态a->观测值o的概率  
10     return A,B,pi;
11     
12 def getForwardPro(A,B,pi,T,O):  #O为观测序列
13     alpha=np.zeros(shape=(T,len(A)))     #定义前向概率
14     for i in range(len(B)):                  #初始化前向概率分布
15         alpha[0][i]=pi[i]*B[ i ][ O[0] ] 
16     
17     for t in range(1,T):            # 递推
18         for i in range( len(A) ):   #  t时刻每个状态
19             pro=0
20             for j in range( len(B) ):        #  前一状态到当前时刻 联合概率
21                 pro=pro+ A[j][i]*alpha[t-1][j];
22             alpha[t][i]=pro*B[i][ O[t] ]          #预测概率
23     OSeqBaseLambdaPro=sum( alpha[T-1] );          # p( O| lambda )
24     return OSeqBaseLambdaPro;

四、验证:统计学习方法 177 编程实现

 1 def getPro():
 2     iniStatePro=[ 0.2 ,0.4, 0.4 ]   #初始状态概率分布列表 3个状态
 3     pi=np.array(iniStatePro)
 4     
 5     stateTransPro=[[ 0.5,0.2,0.3 ],[ 0.3,0.5,0.2 ],[ 0.2, 0.3, 0.5 ]]           #状态转移概率矩阵  N x N 
 6     A=np.array(stateTransPro)  # A[a][b]: 状态a -> 状态b 的概率
 7     
 8     observationPro=[[0.5,0.5],[0.4,0.6],[0.7,0.3]]          #观测概率矩阵     N x M    [红,白]
 9     B=np.array(observationPro) # B[a][o]:状态a->观测值o的概率  
10     
11     return A,B,pi;
12 
13 def getForwardPro(A,B,pi,T,O):  #O为观测序列
14     alpha=np.zeros(shape=(T,len(A)))     #定义前向概率
15     for i in range(len(B)):                  #初始化前向概率分布
16         alpha[0][i]=pi[i]*B[ i ][ O[0] ] 
17     
18     for t in range(1,T):            # 递推
19         for i in range( len(A) ):   #  t时刻每个状态
20             pro=0
21             for j in range( len(B) ):        #  前一状态到当前时刻 联合概率
22                 pro=pro+ A[j][i]*alpha[t-1][j];
23             alpha[t][i]=pro*B[i][ O[t] ]          #预测概率
24     OSeqBaseLambdaPro=sum( alpha[T-1] );          # p( O| lambda )
25     return OSeqBaseLambdaPro;
26 
27 A,B,pi=getPro();
28 T=3
29 O=[0,1,0]
30 pro=getForwardPro(A,B,pi,T,O)
31 print(pro)

结果:技术分享图片

书上答案:0.13022

 

HMM_概率计算——forwar_algorithm实现

标签:def   lambda   前向算法   alpha   代码   统计学习   学习方法   image   sha   

原文地址:https://www.cnblogs.com/z-bear/p/9873090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!