zi663227 发表于 2015-4-27 11:17:46

Python入门练习(二)Viterbi算法

  资料见: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. pathV. prob.
       T = (start_p, , start_p)
   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
               p = emit_p * trans_p
               prob *= p
               v_prob *= p
               total += prob
               if v_prob > valmax:
                   argmax = v_path +
                   valmax = v_prob
         U = (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
       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)
  
页: [1]
查看完整版本: Python入门练习(二)Viterbi算法