個々の質問に答える代わりに、例を使用して HMM ツールボックスの使用方法を説明しましょう。これは、隠れマルコフ モデルを導入するときに通常使用される天気の例です。
基本的にモデルの状態は、晴れ、雨、霧の 3 種類の天気です。いつでも、天気はこれらの値の 1 つだけであると想定しています。したがって、HMM 状態のセットは次のとおりです。
S = {sunny, rainy, foggy}
ただし、この例では、天気を直接観測することはできません (どうやら地下室に閉じ込められているようです!)。代わりに、私たちが持っている唯一の証拠は、あなたを毎日チェックする人が傘を持っているかどうかです. HMM 用語では、これらは離散観測です。
x = {umbrella, no umbrella}
HMM モデルの特徴は次の 3 つです。
- 事前確率: シーケンスの最初の状態にある確率のベクトル。
- 遷移確率: 天候のある状態から別の状態に移行する確率を表すマトリックス。
- 放出確率: 状態 (天気) が与えられたときに出力 (傘であるかどうか) を観測する確率を記述するマトリックス。
次に、これらの確率が与えられるか、トレーニング セットから学習する必要があります。それが完了すると、HMM モデル (または一連のモデル、および最も可能性の高いモデルを選択する) に関して観測シーケンスの尤度を計算するような推論を行うことができます...
1) 既知のモデル パラメータ
モデルを構築するために既存の確率を埋める方法を示すサンプル コードを次に示します。
Q = 3; %# number of states (sun,rain,fog)
O = 2; %# number of discrete observations (umbrella, no umbrella)
%# prior probabilities
prior = [1 0 0];
%# state transition matrix (1: sun, 2: rain, 3:fog)
A = [0.8 0.05 0.15; 0.2 0.6 0.2; 0.2 0.3 0.5];
%# observation emission matrix (1: umbrella, 2: no umbrella)
B = [0.1 0.9; 0.8 0.2; 0.3 0.7];
次に、このモデルから一連のシーケンスをサンプリングできます。
num = 20; %# 20 sequences
T = 10; %# each of length 10 (days)
[seqs,states] = dhmm_sample(prior, A, B, num, T);
たとえば、5 番目の例は次のとおりです。
>> seqs(5,:) %# observation sequence
ans =
2 2 1 2 1 1 1 2 2 2
>> states(5,:) %# hidden states sequence
ans =
1 1 1 3 2 2 2 1 1 1
シーケンスの対数尤度を評価できます。
dhmm_logprob(seqs(5,:), prior, A, B)
dhmm_logprob_path(prior, A, B, states(5,:))
またはビタビ パス (最も可能性の高い状態シーケンス) を計算します。
vPath = viterbi_path(prior, A, multinomial_prob(seqs(5,:),B))

2) 不明なモデル パラメータ
トレーニングは EM アルゴリズムを使用して実行され、一連の観測シーケンスを使用して行うのが最適です。
同じ例を続けると、上記の生成されたデータを使用して新しいモデルをトレーニングし、元のモデルと比較できます。
%# we start with a randomly initialized model
prior_hat = normalise(rand(Q,1));
A_hat = mk_stochastic(rand(Q,Q));
B_hat = mk_stochastic(rand(Q,O));
%# learn from data by performing many iterations of EM
[LL,prior_hat,A_hat,B_hat] = dhmm_em(seqs, prior_hat,A_hat,B_hat, 'max_iter',50);
%# plot learning curve
plot(LL), xlabel('iterations'), ylabel('log likelihood'), grid on

州の順序が一致する必要はないことに注意してください。そのため、2 つのモデルを比較する前に状態を並べ替える必要があります。この例では、トレーニング済みのモデルは元のモデルに近くなっています。
>> p = [2 3 1]; %# states permutation
>> prior, prior_hat(p)
prior =
1 0 0
ans =
0.97401
7.5499e-005
0.02591
>> A, A_hat(p,p)
A =
0.8 0.05 0.15
0.2 0.6 0.2
0.2 0.3 0.5
ans =
0.75967 0.05898 0.18135
0.037482 0.77118 0.19134
0.22003 0.53381 0.24616
>> B, B_hat(p,[1 2])
B =
0.1 0.9
0.8 0.2
0.3 0.7
ans =
0.11237 0.88763
0.72839 0.27161
0.25889 0.74111
分類やパターン認識など、隠れマルコフ モデルでできることは他にもあります。異なるクラスに属する観測シーケンスの異なるセットを持つことになります。各セットのモデルをトレーニングすることから始めます。次に、新しい観測シーケンスが与えられたら、各モデルに関する尤度を計算して分類し、対数尤度が最も高いモデルを予測できます。
argmax[ log P(X|model_i) ] over all model_i