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]