Skip to content

Instantly share code, notes, and snippets.

@hailiang-wang
Last active June 27, 2017 14:39
Show Gist options
  • Save hailiang-wang/45feddc96d6b49f8315ed8771a14fa85 to your computer and use it in GitHub Desktop.
Save hailiang-wang/45feddc96d6b49f8315ed8771a14fa85 to your computer and use it in GitHub Desktop.
维特比算法
# -*- coding: utf-8 -*-
# Python3
# 维特比算法
# demo code of https://zh.wikipedia.org/wiki/%E7%BB%B4%E7%89%B9%E6%AF%94%E7%AE%97%E6%B3%95
states = ('Healthy', 'Fever')
observations = ('normal', 'cold', 'dizzy')
start_probability = {'Healthy': 0.6, 'Fever': 0.4}
transition_probability = {
'Healthy' : {'Healthy': 0.7, 'Fever': 0.3},
'Fever' : {'Healthy': 0.4, 'Fever': 0.6},
}
emission_probability = {
'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
}
# Helps visualize the steps of Viterbi.
def print_dptable(V):
print(" "),
for i in range(len(V)): print("%7d" % i,)
for y in V[0].keys():
print("%.6s: " % y,)
for t in range(len(V)):
print("%.7s" % ("%f" % V[t][y]),)
print
def viterbi(obs, states, start_p, trans_p, emit_p):
V = [{}]
path = {}
# Initialize base cases (t == 0)
for y in states:
V[0][y] = start_p[y] * emit_p[y][obs[0]]
path[y] = [y]
# Run Viterbi for t > 0
for t in range(1,len(obs)):
V.append({})
newpath = {}
for y in states:
(prob, state) = max([(V[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])
V[t][y] = prob
newpath[y] = path[state] + [y]
print("t%d's path" % t, newpath)
# Don't need to remember the old paths
path = newpath
print_dptable(V)
(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
return (prob, path[state])
def example():
return viterbi(observations,
states,
start_probability,
transition_probability,
emission_probability)
print(example())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment