HMM(Hidden Markov Model, 隠れマルコフモデル)をシミュレートするコードです。
言語はC++です。
主な機能は
- 評価:Forwardアルゴリズムによるシンボル列の観測確率計算
- 学習:Baum-Welchアルゴリズムによるパラメータ更新
の2つです。
wsl2
Ubuntu 20.04
gcc 9.4
bash biuld.bash
モデル、シンボル列を入力しシンボル列の出現確率を出力します。
1
下記のコマンドを実行します。
build/forward.out
2
モデルの構造とパラメータ、シンボル列を標準入力で渡します。
入力は下記のように6つの部分を順に並べます。
<状態の数>
<シンボルの数>
<シンボル出力確率>
<状態遷移確率>
<シンボル列の長さ>
<シンボル列>
各部分は下記のように入力します。
- 状態の数:状態の数 ただし始点と終点も含めるので、シンボルを出力する状態の数+2になる
- シンボルの数:シンボルの数
- シンボル出力確率:
行数=シンボルを出力する状態の数、列数=シンボルの数 の浮動小数の配列 列の区切り文字は,(半角カンマ)
i行k列目にはi番目の状態がk番目のシンボルを出力する確率 - 状態遷移確率:
行数=状態の数-1、列数=状態の数 の浮動小数の配列 列の区切り文字は,(半角カンマ)
i行j列目にはi番目の状態からj番目の状態に遷移する確率
ただし便宜上、0番目の状態=始点、状態の数番目の状態=終点とする - シンボル列の長さ:出力確率を計算したいシンボル列の長さ
- シンボル列:シンボルを改行区切りで
3
シンボル列の出現確率が出力されます。
入力
3
2
0.4,0.6
0,1,0
0,0.8,0.2
3
1
1
0
出力
0.018432
テンプレートとなるモデルにランダムなシンボル列を生成させ、パラメータ未知のモデルにそのシンボル列を学習させます。
(未知モデルの構造はテンプレートモデルと同じになります。)
1
下記コマンドを実行します。
build/baumwelch.out
2
テンプレートモデルの構造とパラメータ、生成するシンボル列の個数、学習を繰り返す回数の上限を標準入力で渡します。
入力は下記のように6つの部分を順に並べます。
<テンプレートモデルの状態の数>
<シンボルの数>
<テンプレートモデルのシンボル出力確率>
<テンプレートモデルの状態遷移確率>
<シンボル列の個数>
<最大繰り返し回数>
各部分は下記のように入力します。
- テンプレートモデルの状態の数 ~ テンプレートモデルの状態遷移確率:
評価のときと同様 - シンボル列の個数:学習用に生成するシンボル列の個数
- 最大繰り返し回数:学習を繰り返す回数の上限
3
学習後の未知モデルのパラメータを出力します。
入力
3
2
0.4,0.6
0,1,0
0,0.8,0.2
100
100
出力
number of nodes = 3
number of symbols = 2
transition probabilities =
0.000000 , 1.000000 , 0.000000
0.000000 , 0.575710 , 0.424290
observe symbol probabilities =
0.395166 , 0.604834
MITライセンスです
LICENSEをお読みください。
23年度の認識工学の授業
Rabiner:“An Introduction to Hidden Markov Models” IEEE ASSP Magazine, January, 1986