はじめに
Pythonによるベイズモデルの実装をきちんと学ぼうと思い,森賀新・木田悠歩・須山敦志 著 「Pythonではじめるベイズ機械学習入門」を読むことにした。
本記事は,第4章「潜在変数モデル」のうち混合ガウスモデルに関する読書メモである。
- 本書の紹介ページ
4.1 混合ガウスモデル
潜在変数
潜在変数(Latent Variables)とは,観測できない変数であるが,潜在変数モデルをうまく活用することで,現実世界の複雑なデータの背後にある隠れた構造が捉えられ,有用な示唆が得られることも多い。
4.1.1 モデル概要
混合モデル(Mixture Model)とは,複数の異なる確率分布を混ぜ合わせた新しい確率分布によって表現されるモデルである。
たとえば,
を,の割合で混合した混合ガウスモデル(Gaussian Mixture Model)は以下のようになる。
4.1.2 モデルの詳細
クラスタ割り当てとカテゴリ分布
混合ガウスモデルでは,データが個のガウス分布のいずれから生成されるかを決める必要がある。
番目のデータがどの分布から生成されるかを示すため,潜在変数(クラスタ割り当て)を用いる。
を生成する確率分布としては,カテゴリ分布を用いる。
は,one-hot表現で表すこともある。すなわち,が2番目の分布から生成された場合,となる。
カテゴリ分布は,ベルヌーイ分布を多次元に拡張したものといえる。
すなわちパラメータ(混合比率(Mixture Proportion))は次元のベクトルであり,かつを満たす。
パラメータの事前分布
パラメータの事前分布として,ディリクレ分布を用いる。ディリクレ分布はベータ分布の多次元版である。
4.1.3 実装
サンプルコードを動かしながら,挙動を確認した。
github.com
データの準備
以下のような観測データを対象とする。
モデルの定義
前節で示したようなモデルを定義する。推定対象は,混合比率および各正規分布の平均・分散である。
MCMCによる事後分布からのサンプリング
MCMCによるサンプリングを行なう。ただし今回は,潜在変数が離散変数であるため,勾配計算を用いるHMC法やNUTSは利用できない。
このような場合PyMCでは,複数のアルゴリズムを組合わせてサンプリングする。今回の場合,連続変数はNUTSで,離散変数はCategoricalGibbsMetropolisでサンプリングする。
- サンプルコード
# 20分ほどかかるので要注意 with model: trace = pm.sample(5000, tune=1000, chains=1, random_seed=1, return_inferencedata=True)
- 出力
Sampling chain 0, 0 divergences ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 / 0:28:58
手元の環境では,30分ほどかかった。
サンプルの分布とトレースプロットは下図の通りである。
MCMCの収束は問題無さそうである。