練習がてらC++でHMMのコードを書いた

いわゆるお勉強的なコードなので特に新しいところはないです。

HMMをベースにしたモデルを作る必要が(たぶん)出てきそうなんですが、そういえばHMMの前向き後ろ向きアルゴリズムの付近とか実装したことねぇやべぇと思ったので書いてみました*1。系列の長さが100超える付近からまじめにやらないとアンダーフローで死んだりしたので、Scalingの付近はちゃんとやりました。が、i.i.d.な系列が複数あるバージョンでの推定や、テストデータが未知語を含む場合などは(不真面目なので)端折ってます。まあ、それでも遊べるし...。コードはgithubに上げました。
github.com
対数尤度が単調増加してる感じだったので、こんなんでとりあえずいいかーと思ったものの、去年unsupervisedなpos taggingを機能語と内容語を考慮してモデル化する話の論文とか読んでみて、教師なしのpos taggingで実験したことないなーと思ったので、こっちも実験してみることにしました。Graham Neubigさんが、ノンパラベイズのチュートリアルの題材として教師なしpos taggingをやられていて、その評価用スクリプトも公開してくださっているので、それとそれについているwikipediaのデータで実験しました(ありがとうございます)。結果のほうはgithubのほう見てください。

実際のタスクでやるときには収束も早いohmmとか使ったほうがいいと思いますが、この辺自由にモデル化&実装できないとこの先生き残れないので車輪の再発明をしましたとさ。あとは便利と噂のglogとかwafとかを使ってみたかったという不純な動機もある。

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

*1:前向きとViterbiは昔Rubyで書いたことがある模様