hmmlearn使用簡介


隱含馬爾可夫模型(Hidden Markov Model,HMM)最初是在20世紀60年代后半期,由Leonard E. Baum和其他一些作者在一系列統計學論文中描述的。其最初應用於語音識別領域。

1980年代后半期,HMM開始應用到生物序列,尤其是DNA序列的分析中。隨后,在生物信息學領域,HMM逐漸成為一項不可或缺的技術。

本文內容包含來自:
[1] 用hmmlearn學習隱馬爾科夫模型HMM
[2] 官方文檔

0. 目錄

1. hmmlearn

hmmlearn曾經是scikit-learn項目的一部分,現已獨立成單獨的Python包,可直接通過pip進行安裝,為無監督隱馬爾可夫模型。其官方文檔網址為https://hmmlearn.readthedocs.io/en/stable/。其有監督的版本為seqlearn。

pip3 install hmmlearn

hmmlearn提供三種模型:

名稱 簡介 觀測狀態
hmm.GaussianHMM Hidden Markov Model with Gaussian emissions. 連續
hmm.GMMHMM Hidden Markov Model with Gaussian mixture emissions. 連續
hmm.MultinomialHMM Hidden Markov Model with multinomial (discrete) emissions 離散

2. MultinomialHMM

方法聲明為

class hmmlearn.hmm.MultinomialHMM(n_components=1, startprob_prior=1.0, transmat_prior=1.0,
algorithm='viterbi', random_state=None, n_iter=10, tol=0.01, verbose=False,  params='ste', init_params='ste')

其中,較為常用(或將更新)的參數為:

  • n_components:(int)隱含狀態個數
  • n_iter:(int, optional)訓練時循環(迭代)最大次數
  • tol:(float, optional)Convergence threshold. EM will stop if the gain in log-likelihood is below this value.
  • verbose:(bool, optional)賦值為True時,會向標准輸出輸出每次迭代的概率(score)與本次
  • init_params:(string, optional)決定哪些參數會在訓練時被初始化。‘s’ for startprob, ‘t’ for transmat, ‘e’ for emissionprob。空字符串""代表全部使用用戶提供的參數進行訓練。

2.1 定義、使用:

import numpy as np
from hmmlearn import hmm

states = ["box 1", "box 2", "box3"]
n_states = len(states)

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, n_iter=20, tol=0.001)
model.startprob_=start_probability
model.transmat_=transition_probability
model.emissionprob_=emission_probability

2.2 維特比算法預測狀態

有說法稱,其返回結果為ln(prob),文檔原文為“the log probability”

seen = np.array([[0,1,0]]).T
logprob, box = model.decode(seen, algorithm="viterbi")
print("The ball picked:", ", ".join(map(lambda x: observations[x], seen)))
print("The hidden box", ", ".join(map(lambda x: states[x], box)))

輸出為

('The ball picked:', 'red, white, red')
('The hidden box', 'box3, box3, box3')

2.3 計算觀測的概率

print model.score(seen)

輸出為

-2.03854530992

3. 訓練與數據准備

import numpy as np
from hmmlearn import hmm

states = ["box 1", "box 2", "box3"]
n_states = len(states)

observations = ["red", "white"]
n_observations = len(observations)
model = hmm.MultinomialHMM(n_components=n_states, n_iter=20, tol=0.01)

D1 = [[1], [0], [0], [0], [1], [1], [1]]
D2 = [[1], [0], [0], [0], [1], [1], [1], [0], [1], [1]]
D3 = [[1], [0], [0]]

X = numpy.concatenate([D1, D2, D3])

model.fit(X)
print model.startprob_
print model.transmat_
print model.emissionprob_
print model.score(X)

4.GaussianHMM 參數介紹

http://reader.epubee.com/books/mobile/24/240fbe312d9e3a78b5fe3f238df50e87/text00010.html
原書為《從機器學習到深度學習:基於scikit-learn與TensorFlow的高效開發實戰(劉長龍 著)》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM