隱馬爾可夫模型 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