ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

隠れマルコフ モデル (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 つの状態をもちます。

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

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

出力シンボル行列は次のようになります。

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

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

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

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

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

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

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

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

  • hmmgenerate ― マルコフ モデルから、状態と出力シンボルの列を生成します

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

  • hmmtrain ― 出力シンボルの列から、遷移と出力確率の最尤推定を計算します

  • hmmviterbi ― 隠れマルコフ モデルに対する、most probable 状態経路を計算します

  • 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 が、出力の列であり、出力 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 Toolbox の隠れマルコフ モデル関数は状態 1 で始まります。言い換えると、初期状態の分布では、確率質量のすべてが状態 1 に集中しています。異なる確率分布 p = [p1, p2, ..., pM] を初期状態 M に割り当てるには、次の操作を行います。

  1. 以下の形式の (M+1) 行 (M+1) 列の拡張された遷移行列 を作成します。

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

  2. 以下の形式をもつ、(M+1) 行 N 列の拡張された出力シンボル行列 を作成します。

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

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

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