项目作者: cuteboydot

项目描述 :
implementation of Hidden Markov Model (Forward & Viterbi)
高级语言: Python
项目地址: git://github.com/cuteboydot/HMM.git
创建时间: 2017-05-16T07:25:29Z
项目社区:https://github.com/cuteboydot/HMM

开源协议:

下载


HMM

Implementation of Hidden Markov Model (Forward & Viterbi)
cuteboydot@gmail.com

reference : http://www.kyobobook.co.kr/product/detailViewKor.laf?barcode=9788970859040

example : her life







test1 : foward

Observation P(Walking, Walking, Cleaning, Shopping) = ???






test2 : viterbi

If observasion sequence = [Walking, Walking, Cleaning, Shopping]

Then state sequence = [?, ?, ?, ?]






  • code
    ```python
    import numpy as np

“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
PARAMETER SETTING
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””

#

STATE 0 = RAINNY, STATE 1 = SUNNY

OBSERVATION 0 = WALKING, OBSERVATION 1 = SHOPPING, OBSERVATON 2 = CLEANING

#

SIZE_STATE = 2
SIZE_OBSERVATION = 3

#

TRANSITION PROBABILITY OF STATE

P(RAINNY | RAINNY) = 0.7, P(SUNNY | RAINNY) = 0.3

P(RAINNY | SUNNY) = 0.4, P(SUNNY | SUNNY) = 0.6

#

A = np.zeros(shape=(SIZE_STATE, SIZE_STATE), dtype=np.float)
A[0][0] = 0.7
A[0][1] = 0.3
A[1][0] = 0.4
A[1][1] = 0.6

#

OBSERVATION PROBABILITY

P(WALKING | RAINNY) = 0.1, P(OSHOPPING1 | RAINNY) = 0.4, P(CLEANING | RAINNY) = 0.5

P(WALKING | SUNNY) = 0.6, P(SHOPPING | SUNNY) = 0.3, P(CLEANING | SUNNY) = 0.1

#

B = np.zeros(shape=(SIZE_STATE, SIZE_OBSERVATION), dtype=np.float)
B[0][0] = 0.1
B[0][1] = 0.4
B[0][2] = 0.5
B[1][0] = 0.6
B[1][1] = 0.3
B[1][2] = 0.1

#

INITIAL TRANSITION PROBABILITY

START AS P(RAINNY) = 0.6, P(SUNNY) = 0.4

#

PI = np.zeros(shape=(SIZE_STATE), dtype=np.float)
PI[0] = 0.6
PI[1] = 0.4
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
END PARAMETER SETTING
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””

def forward (ob_seq) :
prob_sum = 0
trans_mat = np.zeros(shape=(len(ob_seq), SIZE_STATE), dtype=np.float)

  1. for a in range(len(ob_seq)) :
  2. for b in range(SIZE_STATE) :
  3. if (a == 0) :
  4. trans_mat[a][b] = PI[b] * B[b][ob_seq[a]]
  5. print ('SEQ %d : %.1f * %.1f = %.4f' % (a, PI[b], B[b][ob_seq[a]], trans_mat[a][b]))
  6. continue
  7. prob_cur = 0
  8. print ('SEQ %d :(' % (a), end='')
  9. for c in range(SIZE_STATE) :
  10. prob_cur += trans_mat[a-1][c] * A[c][b]
  11. print ('%.4f * %.1f' % (trans_mat[a-1][c], A[c][b]), end='')
  12. if(c < SIZE_STATE-1):
  13. print (' + ', end='')
  14. trans_mat[a][b] = prob_cur * B[b][ob_seq[a]]
  15. print (') * %.1f = %.4f' % (B[b][ob_seq[a]], trans_mat[a][b]))
  16. prob_sum = np.sum(trans_mat[a])
  17. return prob_sum, trans_mat

def viterbi (ob_seq) :
st_seq = np.zeros(shape=(len(ob_seq)), dtype=np.int)
trans_mat = np.zeros(shape=(len(ob_seq), SIZE_STATE), dtype=np.float)

  1. for a in range(len(ob_seq)) :
  2. for b in range(SIZE_STATE) :
  3. if (a == 0) :
  4. trans_mat[a][b] = PI[b] * B[b][ob_seq[a]]
  5. print ('SEQ %d : %.1f * %.1f = %.4f' % (a, PI[b], B[b][ob_seq[a]], trans_mat[a][b]))
  6. else :
  7. pre_max = np.argmax(trans_mat[a-1])
  8. trans_mat[a][b] = trans_mat[a-1][pre_max] * A[pre_max][b] * B[b][ob_seq[a]]
  9. print ('SEQ %d : %.4f * %.1f * %.1f = %.4f' % (a, trans_mat[a-1][pre_max], A[pre_max][b], B[b][ob_seq[a]], trans_mat[a][b]))
  10. state_max = np.argmax(trans_mat[a])
  11. st_seq[a] = state_max
  12. return st_seq, trans_mat

print ()
print (‘A : TRANSITION PROBABILITY OF STATE’)
print (A)
print (‘B : OBSERVATION PROBABILITY’)
print (B)
print (‘PI : INITIAL TRANSITION PROBABILITY’)
print (PI)

observation_seq = np.zeros(shape=(4), dtype=np.int)
observation_seq[0] = 0
observation_seq[1] = 0
observation_seq[2] = 2
observation_seq[3] = 1

print ()
print (‘FOWARD TEST’)
print (‘QUERY => P(%s) ??’ % (str(observation_seq)))
print ()

(prob_sum, trans_mat) = forward(observation_seq)
print (‘Transition matrix’)
print (trans_mat)
print ()
print (‘RESULT => %.6f’ % (prob_sum))

print ()
print (‘VIERTBI TEST’)
print (‘QUERY => %s’ % (str(observation_seq)))
print ()

(sate_seq, trans_mat) = viterbi(observation_seq)
print (‘Transition matrix’)
print (trans_mat)
print ()

print (‘EXPECTED STATE SEQUENCE’)
print (‘RESULT => %s’ % (str(sate_seq)))
```