Skip to content

kazetatsu/hmm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

hmm

概要

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

About

hidden markov model

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published