-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathviterbi.py
70 lines (65 loc) · 2.28 KB
/
viterbi.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from hmm import HMM
import numpy as np
import time
#Viterbi algorithm
def viterbi(hmm, initial_dist, emissions):
probs = hmm.emission_dist(emissions[0]) * initial_dist
stack = []
print
print "\t\t-> Probability Matrix"
print
for emission in emissions[1:]:
trans_probs = hmm.transition_probs * np.row_stack(probs)
max_col_ixs = np.argmax(trans_probs, axis=0)
probs = hmm.emission_dist(emission) * trans_probs[max_col_ixs, np.arange(hmm.num_states)]
for item in probs:
print str(item)+" | \t",
print
print
stack.append(max_col_ixs)
state_seq = [np.argmax(probs)]
while stack:
max_col_ixs = stack.pop()
state_seq.append(max_col_ixs[state_seq[-1]])
state_seq.reverse()
return state_seq
def encode(seq):
emissions = []
for ch in seq.upper():
if ch == "A":
emissions.append(0)
elif ch == "C":
emissions.append(1)
elif ch == "G":
emissions.append(2)
elif ch == "T":
emissions.append(3)
return emissions
def main():
start = time.clock()
transition_probs = np.array([
[0.0, 1.0, 0.0, 0.0], #0 = Begin
[0.0, 0.9, 0.1, 0.0], #1 = Exon
[0.0, 0.0, 0.0, 1.0], #2 = Donor
[0.0, 0.0, 0.0, 1.0] #3 = Intron
])
# A C G T
emission_probs = np.array([
[0.0, 0.0, 0.0, 0.0], #0 = Begin
[0.25, 0.25, 0.25, 0.25], #1 = Exon
[0.05, 0.0, 0.95, 0.0], #2 = Donor
[0.4, 0.1, 0.1, 0.4] #3 = Intron
])
initial_dist = np.array([[0.6, 0.4, 0.5, 0.3]])
seq = raw_input("Please insert a sequence: ")
emissions = encode(seq)
hmm = HMM(transition_probs, emission_probs)
stateSeq = viterbi(hmm, initial_dist, emissions)
print
print "Viterbi Best Path: ",
print " -> ".join(["S"+str(x) for x in stateSeq])
print
end = time.clock()
print "Program Running Time: "+str(abs(start-end))+" seconds"
print
return