2016-09-28 16 views
1

隠れマルコフモデル(復号化問題)を使って隠れ状態を予測したいと思います。データはカテゴリに分類されます。隠れた状態には、空腹、休息、練習、および映画が含まれます。観察セットには、食べ物、家庭、屋外&レクレーションと芸術&エンターテイメントが含まれます。私のプログラムは、観測シーケンス(Baum-Welchアルゴリズム)に基づいてHMMを最初に訓練するものです。そして、隠れ状態のシーケンスを予測するためにデコード(ビタビアルゴリズム)を行います。hmmlearn(隠れマルコフモデル)でデコードした後、隠れ状態を対応するカテゴリにマップする方法は?

私の質問は、結果(非負の整数)をHungryやRestなどの対応するカテゴリにどのようにマッピングできるかということです。トレーニングアルゴリズムの非決定論的特性のために、パラメータは同じデータの各トレーニングごとに異なる。したがって、次のコードのように地図を作成すると、隠れ状態のシーケンスが毎回異なります。次のように

コードは次のとおりです。

from __future__ import division 
import numpy as np 
from hmmlearn import hmm 

states = ["Hungry", "Rest", "Exercise", "Movie"] 
n_states = len(states) 

observations = ["Food", "Home", "Outdoor & Recreation", "Arts & Entertainment"] 

# The number in this sequence is the index of observation 
category_sequence = [1, 0, 1, 2, 1, 3, 1] 
Location = np.array([category_sequence]).T 
model = hmm.MultinomialHMM(n_components=n_states).fit(Location) 

logprob, result = model.decode(Location) 
print "Category:", ", ".join(map(lambda x: observations[x], Location.T[0])) 
print "Intent:", ", ".join(map(lambda x: states[x], result)) 

答えて

1

。これはラベルスイッチングの問題として知られています。モデルの対数尤度は、すべての状態にわたって合計されるため、特定の順序とは無関係です。

私が知る限り、それを扱うための一般的なレシピはありません。あなたが試すかもしれないものの中には:

  • 、部分的にラベルされたデータセットを検索し、その上predictを実行し、対応するラベルに状態の指標をマップするために予測を使用しています。
  • 各状態で可能なパラメータ値のヒューリスティックを計算します。これは、多項式の場合はやりにくいかもしれませんが、たとえば多項式をモデル化すると可能です。加速度計データ。

更新:ラベル付きデータからラベルマッピングの状態を推測するのアドホックバージョン。

def guess_labels(hmm, X, labels): 
    result = [None] * hmm.n_components 
    for label, y_t in zip(labels, hmm.predict(X)): 
     assigned = result[y_t] 
     if assigned is not None: 
      # XXX clearly for any real data there might be 
      #  (and there will be) conflicts. Here we just blindly 
      #  hope the ``assert`` never fires. 
      assert assigned == label 
     else: 
      result[y_t] = label 
    return result 
+0

こんにちは、セルゲイ、あなたから聞いてうれしいです。最初のものについては、hmmlearnモジュールで半監督のやり方でそれをどうやってやり遂げることができるのか少し混乱しています。関数フィットを呼び出すと、入力は観測のみになります。それについてもっと教えていただけますか?ありがとう。 – Isaiah

+0

'hmmlearn'は現在HMMを使用した問題のすべてが監督されていない(つまり、ラベルデータがまったく利用できない)ので、2番目のアプローチが必要なので、これを自動的に行う方法はありません。とにかく、私は答えを更新しました。 'guess_labels'の出力があなたのデータに意味をなさせるかどうか教えてください。 –

+0

Sergeiさん、ありがとうございます。データを訓練するためにLSTMに切り替えるだけでOKです。 – Isaiah

関連する問題