-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget_seq_states.py
executable file
·48 lines (45 loc) · 1.95 KB
/
get_seq_states.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
import numpy as np,numpy.random
from init_forward import hmmforward
from scipy import stats
from forward import forward
from backward import backward
from forward_backward import forward_backward
from Baumwelch import Baumwelch
from viterbi import viterbi
def getseqofstates(numstates,numobscases,numsamples,observations,exmodel):
''' returns most probable seq of states and probability of
being in each state for each timestep, as a second argument of size numtimesteps * numstates
Input : numstates,numobscases,numsamples,observations,exmodel
Output: Most likely sequence of state, Optimal Z's and probabilites of being in each state for
each time step.
Exmodel may only be used for the close to reality initialization and is optional
'''
# print gammas
# print most_likely_seq
(pie,transmtrx,obsmtrx) = Baumwelch(observations,numstates,numobscases,numsamples,exmodel)
(seq_states ,deltas)= viterbi(transmtrx,obsmtrx,pie,observations)
return (seq_states,deltas)
def main():
numstates = 2
numobscases = 3
numsamples = 1
numbofobsrv = 50
exmodel = hmmforward(numstates,numobscases,1,numbofobsrv,numsamples)
observations = exmodel.observations
(seqofstates,deltas) = getseqofstates(numstates,numobscases,numsamples,observations,exmodel)
realseqofstates = exmodel.seqofstates
# print np.sum(seqofstates[0,:] == realseqofstates[0,:])
print "I got this much of the sequence right!"
NoCorstates = 0
if numsamples > 1:
for sample in range(numsamples):
NoCorstates += float(np.sum(seqofstates[sample,:] == realseqofstates[sample,:]))
else:
NoCorstates += float(np.sum(seqofstates == realseqofstates))
print float(NoCorstates) /float(numsamples * numbofobsrv)
# print deltas
# print np.shape(seqofstates)
# print np.shape(realseqofstates)
# print np.shape(deltas)
# print np.concatenate((seqofstates,realseqofstates,deltas),axis = 1)
main()