ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

隠れマルコフ モデル (HMM)

隠れマルコフ モデル (HMM) の紹介

"隠れマルコフ モデル" (HMM) は、出力シーケンスを観測するモデルです。ただし、その出力を生成するためにモデルがたどった状態の系列はわかりません。隠れマルコフ モデルの分析は、観測されたデータから状態シーケンスを戻そうとします。

この例では、2 つの状態と 6 種類の可能な出力をもつマルコフ モデルを考えます。モデルは以下を使用します。

  • 1 から 6 のラベルが付いた、6 つの面をもつ赤いサイコロ。

  • 12 面をもち、そのうちの 5 つの面は 2 から 6 のラベルが付けられ、残りの 7 つの面は 1 とラベルが付けられている緑色のサイコロ。

  • 表となる確率が .9 で、裏となる確率が .1 である、偏りのある赤いコイン。

  • 表となる確率が .95 で、裏となる確率が .05 である、偏りのある緑色のコイン。

このモデルは、次の規則を使って、集合 {1、2、3、4、5、6} から数の列を作成します。

  • はじめに、赤いサイコロを投げ、出た数を書き留めます。これが、出力です。

  • 赤いコインを投げ、次のいずれかを行います。

    • 結果が表である場合、赤いサイコロを投げ、結果を書き留めます。

    • 結果が裏である場合、緑色のサイコロを投げ、結果を書き留めます。

  • 続く各ステップでは、前のステップで振ったサイコロと同じ色のコインを投げます。コインが表である場合、前のステップと同じサイコロを投げます。コインが裏である場合、もう一方のサイコロに変更します。

このモデルに対する状態図は、次の図に示すように、赤と緑色の 2 つの状態をもちます。

状態と同じ色のサイコロを投げることによって、ある状態からの出力を決めます。状態と同じ色のコインを投げることによって、次の状態への遷移を決めます。

遷移行列は、次のようになります。

T=[0.90.050.10.95]

出力行列は次のようになります。

E=[161616161616712112112112112112]

コインとサイコロの色から状態シーケンスを知ることができるため、モデルの状態は隠されていません。しかし、サイコロやコインを見せずに、誰かが出力を生成していると仮定してください。見ることができるのは、出力シーケンスのみです。他の数に比べ 1 をより多く見始めた場合、モデルは緑色の状態にあるのではないかと思うかもしれませんが、投げられているサイコロの色を見ることはできないので確信はもてません。

隠れマルコフ モデルは、以下の疑問を提起します。

  • 出力シーケンスが与えられた場合に、最も可能性のある状態経路は何でしょうか。

  • 出力シーケンスが与えられると、どのようにしてモデルの遷移とモデルの出力の確率を推定できるでしょうか。

  • モデルが、与えられたシーケンスを生成する "事前確率" とは何でしょうか。

  • シーケンスの任意の点において、モデルが特定の状態にある "事後確率" とは何でしょうか。

隠れマルコフ モデルの分析

隠れマルコフ モデルに関連する Statistics and Machine Learning Toolbox™ 関数は以下のとおりです。

  • hmmgenerate ― マルコフ モデルから状態および出力シーケンスを生成します

  • hmmestimate ― 出力シーケンスと既知の状態シーケンスから、遷移確率と出力確率の最尤推定値を計算します

  • hmmtrain ― 出力シーケンスから、遷移確率と出力確率の最尤推定値を計算します

  • hmmviterbi ― 隠れマルコフ モデルについて、最も確からしい状態経路を計算します

  • hmmdecode ― 出力シーケンスの事後状態確率を計算します

この節では、隠れマルコフ モデルを解析するためのこれらの関数の使用方法を説明します。

テスト シーケンスの生成

以下のコマンドは、隠れマルコフ モデル (HMM) の紹介で説明したモデルに対する遷移行列と出力行列を作成します。

TRANS = [.9 .1; .05 .95;];

EMIS = [1/6, 1/6, 1/6, 1/6, 1/6, 1/6;...
7/12, 1/12, 1/12, 1/12, 1/12, 1/12];

このモデルから、ランダムな状態シーケンスと出力シーケンスを生成するには、hmmgenerate を使用します。

[seq,states] = hmmgenerate(1000,TRANS,EMIS);

出力 seq が、出力 (emission) のシーケンスであり、出力 states は状態シーケンスです。

hmmgenerate は、ステップ 0 で、状態 1 ではじまり、ステップ 1 で、状態 i1 への遷移を行い、states の最初の要素として、i1 を出力します。初期状態を変更するには、初期状態分布の変更を参照してください。

状態シーケンスの推定

遷移行列 TRANS と出力行列 EMIS が与えられると、関数 hmmviterbi は、Viterbi アルゴリズムを使用して、出力の与えられた列 seq を作成するために、そのモデルがたどると考えられる最も確からしい状態シーケンスを計算します。

likelystates = hmmviterbi(seq, TRANS, EMIS);

likelystates は、seq と同じ長さの列です。

hmmviterbi の正確さをテストするために、列 likelystates と一致する実際の列の states のパーセンテージを計算します。

sum(states==likelystates)/1000
ans =
   0.8200

この場合、最も確からしい状態シーケンスは、ランダムな列の 82% に一致します。

遷移行列と出力行列の推定

関数 hmmestimatehmmtrain は、出力シーケンス seq が与えられると、遷移行列 TRANS と出力行列 EMIS を推定します。

hmmestimate の使用-  関数 hmmestimate を使用するには、このモデルが seq を生成するために通過してきた状態シーケンス states がわかっている必要があります。

以下は、出力および状態のシーケンスを取り、遷移行列および出力行列の推定を出力します。

[TRANS_EST, EMIS_EST] = hmmestimate(seq, states)

TRANS_EST =
0.8989    0.1011
0.0585    0.9415

EMIS_EST =
0.1721    0.1721    0.1749    0.1612    0.1803    0.1393
0.5836    0.0741    0.0804    0.0789    0.0726    0.1104

出力を、オリジナルの遷移行列 TRANS と出力行列 EMIS と比較できます。

TRANS
TRANS =
0.9000    0.1000
0.0500    0.9500

EMIS
EMIS =
0.1667    0.1667    0.1667    0.1667    0.1667    0.1667
0.5833    0.0833    0.0833    0.0833    0.0833    0.0833

hmmtrain の使用-  状態シーケンス states を知らないが、TRANSEMIS の初期推定がある場合でも、hmmtrain を使用して、TRANSEMIS を推定できます。

TRANS および EMIS に対する初期推定をもつとします。

TRANS_GUESS = [.85 .15; .1 .9];
EMIS_GUESS = [.17 .16 .17 .16 .17 .17;.6 .08 .08 .08 .08 08];

以下のように、TRANS および EMIS を推定します。

[TRANS_EST2, EMIS_EST2] = hmmtrain(seq, TRANS_GUESS, EMIS_GUESS)

TRANS_EST2 =
0.2286    0.7714
0.0032    0.9968

EMIS_EST2 =
0.1436    0.2348    0.1837    0.1963    0.2350    0.0066
0.4355    0.1089    0.1144    0.1082    0.1109    0.1220

hmmtrain は、行列 TRANS_GUESSEMIS_GUESS を変える反復アルゴリズムを使用し、その結果各ステップで 調整された行列が、観測される系列 seq を生成する可能性がより高いように計算していきます。アルゴリズムは、連続する 2 回の繰り返しでの行列が互いに 小さい許容誤差内に入ると停止します。

アルゴリズムが、最大反復回数 (既定値は 100) 内で、この許容誤差に達しない場合、アルゴリズムは停止します。この場合、hmmtrain は、TRANS_ESTEMIS_EST の最終値を返し、許容誤差に到達していないという警告を発します。

アルゴリズムが、指定する許容誤差に達しない場合、次のコマンドを使用して、最大反復回数の既定値を大きくします。

hmmtrain(seq,TRANS_GUESS,EMIS_GUESS,'maxiterations',maxiter)

ここで、maxiter は、アルゴリズムが実行する最大のステップ数です。

次のコマンドを使用して、許容誤差の既定値を変更します。

hmmtrain(seq, TRANS_GUESS, EMIS_GUESS, 'tolerance', tol)

ここで、tol は、指定する許容誤差値です。tol の値が大きくなると、アルゴリズムはより迅速に停止しますが、結果の精度は下がります。

hmmtrain の出力行列の信頼性をより低くする 2 つの要因が存在します。

  • アルゴリズムが、真の遷移行列と出力行列を表さない局所的最大値に収束する場合。このことが当てはまると思われる場合は、行列 TRANS_EST および EMIS_EST に対して別の初期推定を使用してください。

  • seq が短すぎて行列を適切に学習できない可能性がある場合。これに当てはまると思われる場合、seq としてより長い列を使用してください。

事後状態確率の計算

出力シーケンス seq の事後状態確率は、seq が出力される場合、モデルが seq にシンボルを生成するときに、ある特定の状態にある条件付き確率です。hmmdecode を使用して事後状態確率を計算することができます。

PSTATES = hmmdecode(seq,TRANS,EMIS)

出力 PSTATES は M 行 L 列の行列です。ここで、M は状態の数であり、L は seq の長さです。PSTATES(i,j) は、seq が出力される場合、seqj 番目のシンボルを生成するときにモデルが状態 i にある条件付き確率です。

hmmdecode は、最初の出力の前に、ステップ 0 で状態 1 にあるモデルから開始します。PSTATES(i,1) は、モデルが次のステップ 1 で状態 i になる確率です。初期状態の変更については、初期状態分布の変更を参照してください。

seq の確率の対数を出力するには、hmmdecode の 2 番目の出力引数を使用します。

[PSTATES,logpseq] = hmmdecode(seq,TRANS,EMIS)

列の確率は、列の長さが増すにつれて 0 になる傾向があります。そのため、十分長い列の確率は、コンピューターが表すことができる最小の正の数よりも小さくなります。hmmdecode は、この問題を回避するために、確率の対数を出力します。

初期状態分布の変更

既定では、Statistics and Machine Learning Toolbox の隠れマルコフ モデル関数は状態 1 で始まります。言い換えると、初期状態の分布では、すべての確率質量が状態 1 に集中しています。別の確率分布 p = [p1, p2, ..., pM] を M 個の初期状態に割り当てるには、次の手順を実行します。

  1. 次のような形式の M+1-by-M+1 に拡張した遷移行列 T^ を作成します。

    T^=[0p0T]

    ここで、T は真の遷移行列です。T^ の 1 列目には M+1 個のゼロが含まれています。p の合計は 1 でなければなりません。

  2. 次のような形式の M+1 行 N 列に拡張した出力行列 E^ を作成します。

    E^=[0E]

遷移行列と出力行列がそれぞれ TRANS および EMIS である場合、次のコマンドを使用して 拡張された行列を作成します。

TRANS_HAT = [0 p; zeros(size(TRANS,1),1) TRANS];

EMIS_HAT = [zeros(1,size(EMIS,2)); EMIS];
この情報は役に立ちましたか?