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