yading@10
|
1 This is a quick description of the viterbi aka dynamic programing
|
yading@10
|
2 algorthm.
|
yading@10
|
3
|
yading@10
|
4 Its reason for existence is that wikipedia has become very poor on
|
yading@10
|
5 describing algorithms in a way that makes it useable for understanding
|
yading@10
|
6 them or anything else actually. It tends now to describe the very same
|
yading@10
|
7 algorithm under 50 different names and pages with few understandable
|
yading@10
|
8 by even people who fully understand the algorithm and the theory behind.
|
yading@10
|
9
|
yading@10
|
10 Problem description: (that is what it can solve)
|
yading@10
|
11 assume we have a 2d table, or you could call it a graph or matrix if you
|
yading@10
|
12 prefer
|
yading@10
|
13
|
yading@10
|
14 O O O O O O O
|
yading@10
|
15
|
yading@10
|
16 O O O O O O O
|
yading@10
|
17
|
yading@10
|
18 O O O O O O O
|
yading@10
|
19
|
yading@10
|
20 O O O O O O O
|
yading@10
|
21
|
yading@10
|
22
|
yading@10
|
23 That table has edges connecting points from each column to the next column
|
yading@10
|
24 and each edge has a score like: (only some edge and scores shown to keep it
|
yading@10
|
25 readable)
|
yading@10
|
26
|
yading@10
|
27
|
yading@10
|
28 O--5--O-----O-----O-----O-----O
|
yading@10
|
29 2 / 7 / \ / \ / \ /
|
yading@10
|
30 \ / \ / \ / \ / \ /
|
yading@10
|
31 O7-/--O--/--O--/--O--/--O--/--O
|
yading@10
|
32 \/ \/ 1/ \/ \/ \/ \/ \/ \/ \/
|
yading@10
|
33 /\ /\ 2\ /\ /\ /\ /\ /\ /\ /\
|
yading@10
|
34 O3-/--O--/--O--/--O--/--O--/--O
|
yading@10
|
35 / \ / \ / \ / \ / \
|
yading@10
|
36 1 \ 9 \ / \ / \ / \
|
yading@10
|
37 O--2--O--1--O--5--O--3--O--8--O
|
yading@10
|
38
|
yading@10
|
39
|
yading@10
|
40
|
yading@10
|
41 Our goal is to find a path from left to right through it which
|
yading@10
|
42 minimizes the sum of the score of all edges.
|
yading@10
|
43 (and of course left/right is just a convention here it could be top down too)
|
yading@10
|
44 Similarly the minimum could be the maximum by just fliping the sign,
|
yading@10
|
45 Example of a path with scores:
|
yading@10
|
46
|
yading@10
|
47 O O O O O O O
|
yading@10
|
48
|
yading@10
|
49 >---O. O O .O-2-O O O
|
yading@10
|
50 5. .7 .
|
yading@10
|
51 O O-1-O O O 8 O O
|
yading@10
|
52 .
|
yading@10
|
53 O O O O O O-1-O---> (sum here is 24)
|
yading@10
|
54
|
yading@10
|
55
|
yading@10
|
56 The viterbi algorthm now solves this simply column by column
|
yading@10
|
57 For the previous column each point has a best path and a associated
|
yading@10
|
58 score:
|
yading@10
|
59
|
yading@10
|
60 O-----5 O
|
yading@10
|
61 \
|
yading@10
|
62 \
|
yading@10
|
63 O \ 1 O
|
yading@10
|
64 \/
|
yading@10
|
65 /\
|
yading@10
|
66 O / 2 O
|
yading@10
|
67 /
|
yading@10
|
68 /
|
yading@10
|
69 O-----2 O
|
yading@10
|
70
|
yading@10
|
71
|
yading@10
|
72 To move one column forward we just need to find the best path and associated
|
yading@10
|
73 scores for the next column
|
yading@10
|
74 here are some edges we could choose from:
|
yading@10
|
75
|
yading@10
|
76
|
yading@10
|
77 O-----5--3--O
|
yading@10
|
78 \ \8
|
yading@10
|
79 \ \
|
yading@10
|
80 O \ 1--9--O
|
yading@10
|
81 \/ \3
|
yading@10
|
82 /\ \
|
yading@10
|
83 O / 2--1--O
|
yading@10
|
84 / \2
|
yading@10
|
85 / \
|
yading@10
|
86 O-----2--4--O
|
yading@10
|
87
|
yading@10
|
88 Finding the new best paths and scores for each point of our new column is
|
yading@10
|
89 trivial given we know the previous column best paths and scores:
|
yading@10
|
90
|
yading@10
|
91 O-----0-----8
|
yading@10
|
92 \
|
yading@10
|
93 \
|
yading@10
|
94 O \ 0----10
|
yading@10
|
95 \/
|
yading@10
|
96 /\
|
yading@10
|
97 O / 0-----3
|
yading@10
|
98 / \
|
yading@10
|
99 / \
|
yading@10
|
100 O 0 4
|
yading@10
|
101
|
yading@10
|
102
|
yading@10
|
103 the viterbi algorthm continues exactly like this column for column until the
|
yading@10
|
104 end and then just picks the path with the best score (above that would be the
|
yading@10
|
105 one with score 3)
|
yading@10
|
106
|
yading@10
|
107
|
yading@10
|
108 Author: Michael niedermayer
|
yading@10
|
109 Copyright LGPL
|