マイノート

いろいろ勉強したことをまとめていきます

MENU

EMアルゴリズムで混合ガウス分布のパラメータ推定できるライブラリ(ruby)

作ったもの

EMアルゴリズムで混合ガウス分布のパラメータ推定ができるライブラリをrubyで作りました。

github.com

使い方

まず、本ライブラリのインストー

gem install t_learn

1次元データに対して

githubにおいてある “sample_1dim.json” を使います。

このデータは正規化(各データ数を表す縦軸に対して)すると以下の画像のようなデータになります。

f:id:ttt242242:20170624211109p:plain

この混合ガウス分布のパラメータを推定します。

require 't_learn'

em = TLearn::EM_Gaussian.new()
data_list = JSON.load(open("./sample_1dim.json"))
history = em.fit(data_list, k_num=2) # k_num はガウス分布の個数

以下、実行結果

likelihood: -3088.0358230172806
likelihood: -3087.7133321058004
省略
likelihood: -2943.95823100874
likelihood: -2943.9582300846514
====================================
pi : [0.29168644105123087, 0.70831355894877]
mu : [[0.029483770596389985], [10.033090965120484]]
conv : [[[4.166929409854276]], [[8.88533611395374]]]

出力されたパラメータを用いると、以下のような(緑のグラフ)混合正規分布を表していることがわかります

f:id:ttt242242:20170624211123p:plain

うまく、パラメータを推定できているようです。

2次元データに対して

PRMLのサンプルデータを今回作成したライブラリ用に加工して、使用させていただきます。 ちなみにサンプルデータfaithful.jsongithubにおいてあります。 下のソースコードと同じディレクトリにサンプルデータを配置して、以下のソースコードを実行します。

require 't_learn'

em = TLearn::EM_Gaussian.new()
data_list = JSON.load(open("./faithful.json"))
history = em.fit(data_list, k_num=2) # k_num はガウス分布の個数

以下、実行結果

likelihood: -1264.5079209519638
likelihood: -1240.5772871778106
省略
likelihood: -1130.2639602913885
likelihood: -1130.263960190925
====================================
pi : [0.6441275620663266, 0.3558724379336733]
mu : [[4.28966107037274, 79.96810425509231], [2.0363874344782444, 54.47850611640881]]
conv : [[[0.1699695817230504, 0.9406238960300867], [0.9406238960300867, 36.04637543657748]], [[0.06916686263691188, 0.4351591734475339], [0.4351591734475339, 33.69722446174996]]]

ここでは、グラフをプロットしていませんが、 参考サイトと同じような値が得られています。(今回データを標準化していないため、対数尤度の値は異なります。)

まぁうまくいっているようです。

参考

今回、このライブラリを作成するのに以下のサイトを特に参考にしました。 ありがとうございました。

aidiary.hatenablog.com