読者です 読者をやめる 読者になる 読者になる

俺とプログラミング

プログラミングに関わることを幅広く発信します。 最近のマイブームはlibGDXとChainerです。

Pythonの隠れマルコフモデルライブラリGHMMの使い方

Python GHMM

Python隠れマルコフモデルライブラリ、GHMMの使いかたを軽く紹介。
コードを見て頂ければなにをやっているか分かると思います。

from ghmm import *

#初期遷移確率行列
A = [[0.6, 0.4, 0], [0, 0.6, 0.4], [0.0, 0.0, 1.0]]

#初期出力確率行列
B = [[0.25, 0.25, 0.25, 0.25], [0.25, 0.25, 0.25, 0.25], [0.25, 0.25, 0.25, 0.25]]

#初期状態確率(left-to-rightモデル)
pi = [1.0, 0, 0]

#とり得るすべての記号を定義
sigma = IntegerRange(0, 4)
#sigma = Alphabet('a','c','d','b') #文字の場合

#隠れマルコフモデルの生成
hmm = HMMFromMatrices(sigma, DiscreteDistribution(sigma), A, B, pi)

#確率の合計が1になるように正規化
hmm.normalize()

#ListからのEmissionSequenceの生成
train_seq = EmissionSequence(sigma, [0, 0, 0, 1, 3, 2, 2, 3])

#BaumWelchアルゴリズムによる学習
hmm.baumWelch(train_seq)

#テスト用のEmissionSequenceの生成
test_seq = EmissionSequence(sigma, [0, 0, 0, 1, 3, 2, 2])

#viterbiアルゴリズムによる尤度と状態遷移の計算
result = hmm.viterbi(test_seq)

print result
# 出力結果
# ([0, 0, 0, 1, 2, 2, 2], -3.988984046564275)

#サンプリング (長さ5のものを10個)
hmm.sample( 10, 5 )




sigmaに含まれていない記号をEmissionSequenceに与えた場合、以下のエラーが出力されます。

must let all symbol into sigma, otherwise you get following errors

File "/usr/local/lib/python2.7/dist-packages/ghmm.py", line 696, in __init__
    internalInput = self.emissionDomain.internalSequence(sequenceInput)
  File "/usr/local/lib/python2.7/dist-packages/ghmm.py", line 393, in internalSequence
    result = map(lambda i: self.index[i], result)
  File "/usr/local/lib/python2.7/dist-packages/ghmm.py", line 393, in <lambda>
    result = map(lambda i: self.index[i], result)
KeyError: 12
Exception AttributeError: "'EmissionSequence' object has no attribute 'cseq'" in <bound method EmissionSequence.__del__ of <ghmm.EmissionSequence object at 0x7f5746025d90>> ignored



パターン認識と機械学習 上
パターン認識と機械学習 下 (ベイズ理論による統計的予測)