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

代码如下

 

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)

 

 

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)

 

posted on 2010-04-07 09:30  finallyly  阅读(4380)  评论(2编辑  收藏  举报