-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHMM.py
More file actions
50 lines (45 loc) · 2.38 KB
/
Copy pathHMM.py
File metadata and controls
50 lines (45 loc) · 2.38 KB
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
import numpy as np
import numpy.ma as ma
from numpy.ma import filled
from numpy import log
def HMMViterbi(ESeq,T,E): #List,np.ndarray,np.ndarray
logT=ma.log(np.matrix(T)).filled(np.NINF).T;#to avoid log(0) convert to -inf
logE=ma.log(np.matrix(E)).filled(np.NINF).T;#to avoid log(0) convert to -inf
No_ofStates=len(T);Seq_Lenth=len(ESeq);
V=np.full((No_ofStates,1),np.NINF); V[0,0]=0;V1=np.copy(V);
PTr=np.zeros((No_ofStates,Seq_Lenth));SSeq=[-1]*Seq_Lenth;
for Idx,Ems in enumerate(ESeq):
for Id,Tc in enumerate(logT):
VTemp=np.copy(V1+Tc.T);
V[Id]=max(VTemp);
PTr[Id,Idx]=np.argmax(VTemp);
V=V+logE[Ems].T;
V1=np.copy(V);
SSeq[Idx]=np.argmax(V1);
#BackTracking
for Idx in range(Seq_Lenth-2,-1,-1):
SSeq[Idx]=int(PTr[SSeq[Idx+1]][Idx+1])
return SSeq
def probability(Matrix):
for a,b in enumerate(Matrix):
Add=sum(b)
if Add!=0: #Sum up the entire row
for i in range(len(b)):
Matrix[a][i]=Matrix[a][i]/Add #divide each entry with sum
return Matrix
def HmmEstimate(StateSignal,EmissionSignal): #Only takes lists
if(len(StateSignal)==len(EmissionSignal)): #Comparing the size of Emission and Transisition Matrix
#Emission Matrix creation
Ematrix=np.zeros((max(StateSignal)+1,max(EmissionSignal)+1)) #Initiation of Emission Matrix
for i in list(zip(StateSignal,EmissionSignal)): #clubbed both State & Emission signal for easy access
Ematrix[i[0]][i[1]]+=1 #count the no.of entries per each state in the respective place
Ematrix=probability(Ematrix) #calling probability function
#Transistion Matrix creation
Tmatrix=np.zeros((max(StateSignal)+1,max(StateSignal)+1)) #Initiation of State Matrix
for i in range(len(StateSignal)-1):
Tmatrix[int(StateSignal[i])][int(StateSignal[i+1])]+=1 #count the each transistion in their respective place.
Tmatrix=probability(Tmatrix) #calling probability function
else:
Error('State Signal and Emission signal should be of same length')
exit()
return [Tmatrix,Ematrix]