Python入门练习(二)Viterbi算法

资料见:http://en.wikipedia.org/wiki/Viterbi_algorithm

代码如下

 

ExpandedBlockStart.gif C:Python26MyViterbiMyViterbi.py
#  -*- coding: cp936 -*-

def  forward_viterbi(obs, states, start_p, trans_p, emit_p):
   T 
=  {}
   
for  state  in  states:
       
# #          prob.           V. path  V. prob.
       T[state]  =  (start_p[state], [state], start_p[state])
   
for  output  in  obs:
       U 
=  {}
       
for  next_state  in  states:
           total 
=  0
           argmax 
=  None
           valmax 
=  0
           
for  source_state  in  states:
               (prob, v_path, v_prob) 
=  T[source_state]
               p 
=  emit_p[source_state][output]  *  trans_p[source_state][next_state]
               prob 
*=  p
               v_prob 
*=  p
               total 
+=  prob
               
if  v_prob  >  valmax:
                   argmax 
=  v_path  +  [next_state]
                   valmax 
=  v_prob
           U[next_state] 
=  (total, argmax, valmax)
       T 
=  U
   
# # apply sum/max to the final states:
   total  =  0
   argmax 
=  None
   valmax 
=  0
   
for  state  in  states:
       (prob, v_path, v_prob) 
=  T[state]
       total 
+=  prob
       
if  v_prob  >  valmax:
           argmax 
=  v_path
           valmax 
=  v_prob
   
return  (total, argmax, valmax)

 

 

ExpandedBlockStart.gif C:Python26MyViterbimyTestViterbi.py
#  -*- coding: cp936 -*-
from  MyViterbi  import  forward_viterbi
states
= ( ' Rainy ' , ' Sunny ' ) # 元组
observations = ( ' walk ' , ' shop ' , ' clean ' ) # 元组
start_probability = { ' Rainy ' : 0.6 , ' Sunny ' : 0.4 }
transition_probility
= {
    
' Rainy ' :{ ' Rainy ' : 0.7 , ' Sunny ' : 0.3 },
    
' Sunny ' :{ ' Rainy ' : 0.4 , ' Sunny ' : 0.6 }
    }
emission_probability
= {
    
' Rainy ' :{ ' walk ' : 0.1 , ' shop ' : 0.4 , ' clean ' : 0.5 },
    
' Sunny ' :{ ' walk ' : 0.6 , ' shop ' : 0.3 , ' clean ' : 0.1 }
    }
observation
= ( ' walk ' , ' clean ' , ' walk ' )


c
= forward_viterbi(observation,states,start_probability,transition_probility,emission_probability)
print  c

 

别忘了在MyViterbi文件夹下加init.py

直接运行myTestViterbi.py

结果如下:

(0.023729999999999994, ['Sunny', 'Rainy', 'Sunny', 'Sunny'], 0.0051839999999999994)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值