作ったもの
EMアルゴリズムで混合ガウス分布のパラメータ推定ができるライブラリをrubyで作りました。
使い方
まず、本ライブラリのインストール
gem install t_learn
1次元データに対して
githubにおいてある “sample_1dim.json” を使います。
このデータは正規化(各データ数を表す縦軸に対して)すると以下の画像のようなデータになります。
この混合ガウス分布のパラメータを推定します。
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]]]
出力されたパラメータを用いると、以下のような(緑のグラフ)混合正規分布を表していることがわかります
うまく、パラメータを推定できているようです。
2次元データに対して
PRMLのサンプルデータを今回作成したライブラリ用に加工して、使用させていただきます。
ちなみにサンプルデータfaithful.jsonはgithubにおいてあります。
下のソースコードと同じディレクトリにサンプルデータを配置して、以下のソースコードを実行します。
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]]]
ここでは、グラフをプロットしていませんが、
参考サイトと同じような値が得られています。(今回データを標準化していないため、対数尤度の値は異なります。)
まぁうまくいっているようです。
参考
今回、このライブラリを作成するのに以下のサイトを特に参考にしました。
ありがとうございました。
コメント