HMM隱馬爾科夫模型與實例1

隱馬爾可夫模型 Hidden Markov Model (HMM)

以下三個問題,人們提出了相應的算法

  • 1 評估問題: 前向算法
  • 2 解碼問題: Viterbi算法 (維特比算法)
  • 3 學習問題: Baum-Welch算法(向前向後算法)
import numpy as np
from hmmlearn import hmm

# 隱藏狀態:3個盒子
states = ['box1', 'box2', 'box3']
n_states = len(states)

# 觀測狀態:2種球
observations = ['red', 'white']
n_observations = len(observations)

# 模型參數
start_probability = np.array([0.2, 0.4, 0.4])
transition_probability = np.array([[0.5, 0.2, 0.3],[0.3, 0.5, 0.2],[0.2, 0.3, 0.5]])
emission_probability = np.array([[0.5, 0.5],[0.4, 0.6],[0.7, 0.3]])

# 用於離散觀測狀態
model = hmm.MultinomialHMM(n_components = n_states)

model.startprob_ = start_probability
model.transmat_ = transition_probability
model.emissionprob_ = emission_probability

# 維特比算法
seen = np.array([[0, 1, 0]]).T
logprob, box = model.decode(seen, algorithm='viterbi')

print(logprob)
np.array(states)[box]

-4.219907785197447
array([‘box3’, ‘box3’, ‘box3’], dtype=’<U4’)

# predict是一樣的
box2 = model.predict(seen)
print(np.array(states)[box2])

# 得到觀測序列的概率 ln0.13022≈−2.0385
print(model.score(seen))

[‘box3’ ‘box3’ ‘box3’]
-2.03854530992

EM算法求解HMM模型參數

tol: 停機閾值
n_iter: 最大迭代次數
n_components: 隱藏狀態數目

model2 = hmm.MultinomialHMM(n_components=n_states, n_iter=20, tol=0.01)
X2 = np.array([[0,1,0,1],[0,0,0,1],[1,0,1,1]])
model2.fit(X2)

print('startprob_', model2.startprob_)
print('transmat_', model2.transmat_)
print('emissionprob', model2.emissionprob_)
print('score: ', model2.score(X2)

startprob_ [1.00000000e+00 8.01348421e-11 2.36092219e-13]


transmat_ [[3.41584225e-06 3.71582298e-01 6.28414286e-01]
[6.63146682e-01 1.56748226e-01 1.80105092e-01]
[5.83970676e-01 1.83440373e-01 2.32588951e-01]]


emissionprob_ [[9.99753537e-01 2.46462787e-04]
[1.98178068e-01 8.01821932e-01]
[1.44582902e-01 8.55417098e-01]]


score -6.53832853076122

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章