混合ガウスモデル(Gaussian Mixture Model)|PyMC3チュートリアルに学ぶ統計モデリング #6

f:id:lib-arts:20200929170337p:plain

当シリーズではPyMC3のチュートリアルを元に統計モデリングについて確認しています。PyMC3はベイズ統計モデリングのためのPythonのパッケージで、Pythonにおいてベイズ統計を取り扱うにあたってはデファクトとみて良いパッケージだと思います。
#1〜#5は下記のように進めました。

ベイズロジスティック回帰(Logistic Regression)モデル|PyMC3チュートリアルに学ぶ統計モデリング #3 - Liberal Art’s diary

PyMC3における確率分布(Probability Distributions)の実装|PyMC3チュートリアルに学ぶ統計モデリング #4 - Liberal Art’s diary

#6では混合ガウスモデル(Gaussian Mixture Model)について取り扱います。

Gaussian Mixture Model — PyMC3 3.9.3 documentation

以下、目次になります。
1. 問題設定&モデリングの理論的な内容の確認
2. 実装の確認
3. まとめ


1. 問題設定&モデリングの理論的な内容の確認
1節では問題設定とモデリングの理論的な内容の確認を行います。

f:id:lib-arts:20200929171149p:plain

問題設定は上記のように記載されています。少しわかりづらいかもしれませんが、3つの集団を考えそれぞれの中心をそれぞれ-5、0、5とすることでそれぞれのサンプルのサンプリングを行なっています。これだけだと少々わかりづらいので、上記の代わりに下記を実行してみていただけたらと思います。

# simulate data from a known mixture distribution
np.random.seed(12345) # set random seed for reproducibility

k = 3
ndata = 500
spread = 5
centers = np.array([-spread, 0, spread])

# simulate data from mixture distribution
v = np.random.randint(0, k, ndata)
data = centers[v] + np.random.randn(ndata)

print(v[:10])
print(centers[v[:10]])
print(data[:10])
plt.hist(data);

f:id:lib-arts:20200929171719p:plain

ヒストグラムの記載だけではわかりづらいので、10個のサンプルに対してvの中身とそれぞれのcenters、そしてサンプリングした値を確認してみました。np.random.randn()は平均0、分散1の正規分布を元にしたサンプリングなので、だいたいの値が-2〜2の間におさまります。このようなサンプリングを行うことで、山が3つあるように見えるヒストグラムが作成されています。

このようなサンプルを混合ガウスモデルを元にパラメータ推定を行うのが今回の問題設定です。大体の問題設定については把握できたので1節はここまでとします。


2. 実装の確認
2節では実装を確認していきます。

f:id:lib-arts:20200929172549p:plain

モデリングについては上記のように記載を行っています。likelihoodはpointsで計算を行っていますが、観測されたサンプル(observed)とモデリングによる予測値の比較として評価指標としています。また、混合モデルのパラメータはmuとsigmaとpで基本的には表現されており、pについてはcategoryに変換してmeansのインデックスとして用いています。基本的には事前分布として、pとmeansを中心に把握しておくのが良いと思います。

f:id:lib-arts:20200929173943p:plain

収束後の可視化については上記のようになっています。それぞれの分布に分類される割合のpが0.3〜0.4あたりに分布しているのと、それぞれの集団の平均が-5、0、5になっていることが確認できるので概ね妥当なモデリングになっていると、ここでは考えることができます。


3. まとめ
#6ではチュートリアルより"Gaussian Mixture Model"について取り扱いました。