Golangでバンディットアルゴリズムを実装した。

以下の書籍を参考にGolangでバンディットアルゴリズムを実装してみた。
書籍に載っているEpsilon-Greedy、Softmax、UCB1を実装してから、Epsilon-GreedyとSoftmaxはAnnealingを追加してみた。
書籍ではPythonでtsvファイルを生成してからRで可視化しているけれど、今回はGolangでグラフを描画した。
書籍と同じようなグラフができたので、たぶん同じように実装できているはず。
Annealingを追加したグラフは書籍には載っていないけれど、EpsilonとかTemperatureにあまり影響されない結果になった。

Bandit Algorithms for Website Optimization

Bandit Algorithms for Website Optimization

f:id:yukihir0:20150127191131p:plain

f:id:yukihir0:20150127191145p:plain

f:id:yukihir0:20150127191155p:plain

f:id:yukihir0:20150127191206p:plain

f:id:yukihir0:20150127191219p:plain

アルゴリズムを呼び出してシミュレートするコードはこんな感じ。

GolangでMeCabを使う。

以下の記事を参考にGolangからMeCabを呼び出してみた。

オリジナル版だとMeCabの解析結果が1行ずつstringで返ってくるので、表層形などをメンバに持つ構造体を定義して結果を格納するようにした。

名詞のみを抽出する場合、以下のように書ける。

GolangでSVMを実装した。

パーセプトロンに続き、SVMを実装した。
書籍を参考に劣勾配法とFOBOSの2つを試してみた。
ただ、書籍の更新式のとおりに実装するとうまく分離できなかったので、更新式を変えている。
学習数や学習率などのパラメータをいじるとうまく分離できないこともある。
根本的に間違っているのか、パラメータの選び方が悪いのかはわからない。

劣勾配法

f:id:yukihir0:20150115200909p:plain

FOBOS

f:id:yukihir0:20150115200916p:plain

日本語入力を支える技術 ?変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)

日本語入力を支える技術 ?変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)

Golangでパーセプトロンを実装した。

Golangパーセプトロンを実装してみた。
だいぶ大雑把だけれど、うまく動いている様子。
機械学習の理論は複雑だけれど、プログラム的には更新式が肝なのがよくわかった。
効率よく計算させるアルゴリズムも他にあるのだとは思うけれど、単純なものでも自分の手で動かして結果を見るのはやっぱり楽しい。

f:id:yukihir0:20150114201354p:plain

参考