機械と学習する

統計解析、機械学習について学習したことをまとめていきます

ベイズ推論により混合分布のパラメータ推論をやってみる 〜まずはガウス分布のパラメータ推論〜

[2020/03/12更新] 後続の記事へのリンクを追加

【概要】

  • 混合分布(混合モデル)はモデルを潜在変数でスイッチする構造を持ったモデルであり、実用的な観点でも面白いです
  • これから数回にわたって、混合分布を使って遊んでみます
  • 第1弾では、混合分布の中でもよく使われるガウス混合分布を構成する「ガウス分布」のパラメータ推論をやってみます

【目次】


はじめに

機械学習や統計の問題では、手元にあるデータを解釈して応用しようとしますね。 この時、明に暗になんらかの「確率モデル」を仮定しているはずです。

確率モデルの中でも、混合分布(混合モデル)は、複数の確率モデルの組み合わせとして定義されており、複雑なデータ構造を表現できます。 応用としても、クラス分類や多クラスの回帰など面白い実用例があります。

ということで本記事から数回にわたって、混合モデルを使って遊んでみたいと思います。
第1弾となる本記事では、混合モデルの中でもよく使われている「ガウス混合モデル(GMM;Gaussian Mixture Model)」の混合要素であるガウス分布のパラメータ推論を行ってみます。 (なので、本記事ではまだ混合分布は扱わないです(汗))

ベイズ推論により混合分布のパラメータ推論をやってみる 記事一覧】

  • 第1弾:当記事
  • 第2弾:

learning-with-machine.hatenablog.com

  • 第3弾:

learning-with-machine.hatenablog.com

  • 第4弾:

learning-with-machine.hatenablog.com

【トップに戻る】

ガウス分布

ガウス分布正規分布)はよく知られた確率分布の一つです。

f:id:hippy-hikky:20200306001342p:plain

平均ベクトル\muと共分散行列\Sigmaの二つのパラメータで定義される確率分布です。これらのパラメータは事前に与えられるものではなく、データに基づいて推論する必要があります*1

どのようにして推論しましょうか? データから算術平均をとるなどで推論することもできますが、ここではベイズ推論によってパラメータを推論してみます。 また本記事では、パラメータは解析的に求めるのではなく、MCMCアルゴリズムを利用した近似ベイズ推論を行います。

ガウス分布のパラメータの解析的な推論については、「ベイズ推論による機械学習 入門」や「PRML」などを参照ください。 また実際の近似推論にはPythonで扱えるPPL(確率プログラミング言語)の一つであるPyMC3を利用します*2

【トップに戻る】

ガウス分布のパラメータ推論

実際の推論については、以下に添付するnotebookを参照ください。 重要な部分だけかいつまんで解説します。

1次元ガウス分布

1次元ガウス分布のパラメータ推論は最も単純なベイズ推論の適用例です。 ここでPyMC3の記法にも慣れておきます。

重要なのは↓です。モデルの定義として、登場するパラメータの確率分布を設定しています。

with pm.Model() as m_single:
    # p($\mu$)
    mu = pm.Normal('mu', mu=0, tau=0.01)
    # p($\tau$)
    tau = pm.Gamma('tau', alpha=1., beta=0.1)
    # p(x | $\mu, \sigma^2$)
    x_obs = pm.Normal('x_obs', mu=mu, tau=tau, observed=x)

PyMC3では上記のように、各確率変数の確率分布を定義し、確率分布のパラメータとして依存関係を表現していきます。観測変数は、observedオプションでデータを入力します。 だいぶ直感的ですね。

推論結果は以下のように設定値をうまく推論できていることがわかります。 設定値は、\mu=1.5, \tau=10.0です。

f:id:hippy-hikky:20200306003503p:plain
パラメータの事後分布.左から,平均パラメータ,精度(分散の逆数)パラメータ.

多次元(2次元)ガウス分布

2次元のガウス分布は、2次元の平均ベクトルと、2×2の共分散行列で定義されます。

この共分散行列ですが、推論には3つのアプローチがあるらしいです(Pythonによるベイズ統計モデリング)。

  1. 多変量ガウス分布の分散の共役事前分布であるウィシャート分布を利用して解析的、近似的に解を得る(モダンなアプローチでは使わないらしい)
  2. LKJ分布を利用する(PyMC3Examples
  3. 共分散行列の各要素を相関係数標準偏差に分解してそれぞれ推論する

1番のアプローチが有名ですよね。 まずこちらで実装しようと思ったのですが、今回利用しているPyMC3では、どうやらウィシャート分布からのサンプルをサポートしていない(?)ようでした。 ドキュメントやgithubのissueを読んでも、LKJ分布を利用しろとあるばかりで・・・。

ということで、2番と3番のアプローチを両方試してみます。 なお、LKJ分布は相関行列の事前分布ということらしいので、結局のところどちらも同じようなアプローチとなります。 LKJ分布を使った例では、PyMC3が提供するLKJCholeskyCov APIを利用するのですが、共分散行列の逆行列の不安定さを解消するためにコレスキー分解を利用しているため、より安定するみたいです。

詳しくはnotebookにも解説を書いています。

推論結果は以下のように、設定値をうまく推論できていそうですね。

f:id:hippy-hikky:20200306005127p:plain
2次元ガウス分布のパラメータ推論結果.事後分布の平均を使って推論した分布を描画.青の楕円が設定値,オレンジの楕円が推論結果を示す.

ということで実際のnotebook

【トップに戻る】

まとめ

本記事では、ガウス分布のパラメータをベイズ推論により推論してみました。

共分散行列の推論方法として、共役分布であるウィシャート分布は使われないというのが発見でした。 ウィシャート分布を使った場合と比較してどの程度効率が良いのかは、PyMC3では試せていないですが、他のフレームワークを使っていつか試してみようかなと思います。

今回はガウス分布のパラメータ推論だけだったのであまり面白くはなかったですが、ガウス混合モデルを扱うための準備ということで。次回はガウス混合分布のパラメータ推論をやってみます。

【トップに戻る】

参考文献

パターン認識と機械学習 上

パターン認識と機械学習 上

【トップに戻る】

*1:この推論の操作を「学習」と呼んだりします

*2:PPLには他にもPyroやtensorflow probabilityなどがあります。Rで使えるStanなどが特に有名ですね。