/
decode.py
55 lines (52 loc) · 1.19 KB
/
decode.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import avgll as a
import bestHMM
hmm = bestHMM.getHMM()
data = [line.strip() for line in open('../data/decode.txt')][0]
def viterbi(data, hmm):
alpha = [[[1,0],[0,0]]]
t = 0
track = [[],[]]
for c in data:
t+=1
alpha.append([[0, 0],[0, 0]])
for j in range(0, 2):
cand = [[0.0, 0],[0.0,0]]
for i in range(0,2):
ptrans = a.getTransitionProbability(i, j, hmm)
cand[i]=a.multiplyProbability(alpha[t-1][i], ptrans)
if a.compareProbability(cand[0], cand[1])==1:
better=cand[0]
track[j].append(0)
else:
better=cand[1]
track[j].append(1)
pemit = a.getEmissionProbability(j, c, hmm)
prob = a.multiplyProbability(better, pemit)
# print prob
alpha[t][j]=prob
# print alpha[t]
#print scale[t]
if a.compareProbability(alpha[t][0], alpha[t][1])==1:
start=0
else:
start=1
s = ''
# print track[0]
for i in range(len(track[0])-1, -1, -1):
if start==0:
s='A'+s
else:
s='B'+s
start = track[start][i]
return s
def MLdecode(data, hmm):
s=''
for c in data:
emiA = a.getEmissionProbability(0, c, hmm)
emiB = a.getEmissionProbability(1, c, hmm)
if a.compareProbability(emiA, emiB)==1:
s+='A'
else:
s+='B'
return s
print MLdecode(data, hmm)