jiku log

JTCのデータサイエンス中間管理職の学び

「Pythonではじめるベイズ機械学習入門」を読む ~第4章 潜在変数モデル①(混合ガウスモデル)~

4.1 混合ガウスモデル

潜在変数

潜在変数(Latent Variables)とは,観測できない変数であるが,潜在変数モデルをうまく活用することで,現実世界の複雑なデータの背後にある隠れた構造が捉えられ,有用な示唆が得られることも多い。

4.1.1 モデル概要

混合モデル(Mixture Model)とは,複数の異なる確率分布を混ぜ合わせた新しい確率分布によって表現されるモデルである。
たとえば,

  •  p_A(x) \sim \mathcal{N}(2.0, 0.3^2)
  •  p_B(x) \sim \mathcal{N}(3.4, 0.6^2)
  •  p_C(x) \sim \mathcal{N}(5.2, 0.4^2)

を, 3:6:1の割合で混合した混合ガウスモデル(Gaussian Mixture Model)は以下のようになる。

4.1.2 モデルの詳細

クラスタ割り当てとカテゴリ分布

混合ガウスモデルでは,データが K個のガウス分布のいずれから生成されるかを決める必要がある。
 n番目のデータ x_nがどの分布から生成されるかを示すため,潜在変数(クラスタ割り当て) z_n \in \{ 1, 2, \cdots, K  \}を用いる。
 z_nを生成する確率分布としては,カテゴリ分布を用いる。


 \begin{align}
z_n \sim \mathrm{Cat}(\pi)  \\
\end{align}

 z_nは,one-hot表現で表すこともある。すなわち, x_nが2番目の分布から生成された場合, z_n = (0, 1, 0)^Tとなる。

カテゴリ分布は,ベルヌーイ分布を多次元に拡張したものといえる。
すなわちパラメータ \pi(混合比率(Mixture Proportion))は K次元のベクトルであり, \pi \in (0, 1)かつ \sum_{k=1}^{K} \pi_k = 1を満たす。

パラメータの事前分布

パラメータ \piの事前分布として,ディリクレ分布を用いる。ディリクレ分布はベータ分布の多次元版である。


 \begin{align}
\pi \sim \mathrm{Dir}(\alpha)  \\
\end{align}

観測値に関する確率分布

観測値 x_nについては,混合する K個のガウス分布のうち, k番目のガウス分布から生成されたとする。


 \begin{align}
x_n \sim \mathcal{N}(\mu_k, \sigma_k^2)  \\
\end{align}

観測値に関する確率分布のパラメータの事前分布

パラメータ \mu_k, \sigma_kの事前分布を設定する。
 \mu_kには値の制約が特にないため,ガウス分布を設定する。


 \begin{align}
\mu_k \sim \mathcal{N}(\mu_{\mu_k}, \sigma_{\mu_k}^2)  \\
\end{align}

 \sigma_kは正の値を取る必要があるので,半コーシー分布を用いる。


 \begin{align}
\sigma_k \sim \mathrm{HalfCauchy}(\beta)  \\
\end{align}

4.1.3 実装

サンプルコードを動かしながら,挙動を確認した。
github.com

データの準備

以下のような観測データを対象とする。

モデルの定義

前節で示したようなモデルを定義する。推定対象は,混合比率 \piおよび各正規分布の平均・分散である。

MCMCによる事後分布からのサンプリング

MCMCによるサンプリングを行なう。ただし今回は,潜在変数 zが離散変数であるため,勾配計算を用いるHMC法やNUTSは利用できない
このような場合PyMCでは,複数のアルゴリズムを組合わせてサンプリングする。今回の場合,連続変数はNUTSで,離散変数 zは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の収束は問題無さそうである。

サンプルごとのクラスタへの割り当て結果

各サンプルが,どのクラスタに割り当てられているかは,事後分布の期待値が最大のクラスタを求めればよい。
割り当てられたクラスタごとに色分けして観測データのヒストグラムを描くと下図のようになる。

本書の図4.6と比較すると,クラスタ番号が異なっていることが分かる。

本書 手元の環境
1 1
2 2
3 0

クラスタの番号については,その並び順の自由度があるようである。

まとめと感想

潜在変数モデルのうち,混合ガウスモデルについて学んだ。

クラスタリング機械学習の代表的なタスクの1つであり,EMアルゴリズムクラスタリングを行なうというのは試したことがあったが,MCMCでも求めたことはなかったので参考になった。

離散変数と連続変数が混ざっている場合でも,自動的にアルゴリズムを選択するのはPyMCの強みであると感じた。ただ計算時間が30分ほどかかったので,実務で使うときには注意したい。


本記事を最後まで読んでくださり,どうもありがとうございました。

参考サイト

github.com