機械と学習する

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

ベイズ推論により混合分布のパラメータ推論をやってみる 〜線形回帰モデルの混合〜

【概要】

  • 混合分布(混合モデル)はモデルを潜在変数でスイッチする構造を持ったモデルであり、実用的な観点でも面白いです
  • 弊ブログでは数回にわたって、混合分布を使って遊んでみています(これが3記事目)
  • 第3弾では、線形回帰モデルのパラメータ推論(ベイズ線形回帰)と線形回帰モデルを混合したモデルの推論をやってみます

【目次】


はじめに

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

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

ということで数回にわたって、混合モデルを使って遊んでみたいと思います。
第3弾となる本記事では、線形回帰モデルをベイズ推論でパラメータ推論する、いわゆるベイズ線形回帰と線形回帰モデルを混合したモデル(ここでは、「混合線形回帰モデル」と呼ぶことにします)の推論をやってみます。

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

learning-with-machine.hatenablog.com

【トップに戻る】

ベイズ線形回帰

回帰モデルは機械学習の問題ではよく出てくるモデルですね*1

回帰モデルは、データYがデータXと確率変数Wに依存する構造です(下図)。Xを説明変数、 Yを目的変数、Wを重みパラメータなど呼ぶことが多いかもしれません。また、データXをそのまま使うのではなく、n次関数などのなんらかの関数\phi(X)を通すことも多いですね*2。このような操作を特に「特徴抽出」と呼んだりします。

f:id:hippy-hikky:20200313213335p:plain:w250

データ(X,Y)はN個のペアとして与えられるもので、未知の変数W(X,Y)のペアに基づいて推論することが目的です。

YWXのなんらかの関数f(W,X)を平均としたガウスノイズが付加されて観測されるものとします*3f(W,X)は、XにM個の関数\phi(\cdot)を通して得られる値とW=\{w_0, w_1, \cdots, w_M\}の線型結合とします。

f:id:hippy-hikky:20200313214346p:plain:h100

Wが推論できれば、未知の入力変数x_*に対するp(y_* | x_*, W, X, Y)を推論することができます。

線形回帰のベイズ推論については、解析解を求めることができます。詳しくは下記参考資料を参照してください。弊ブログでもソースコード付きで記事を公開していますので、興味があればこちらもご覧ください。

learning-with-machine.hatenablog.com

learning-with-machine.hatenablog.com

本記事では、MCMCアルゴリズムを利用して近似解を推論します。また、MCMCアルゴリズムはPyMC3を利用します。

パラメータ推論とその結果

ソースコード全文は添付のnotebookに掲載しています。必要な方は是非参照ください。

前回のガウス混合分布の推論でも書きましたが、PyMC3では確率モデルを上記のようにグラフィカルモデルなどで書けてしまえば、あとは、その確率変数の関係性を並べていくだけです。線形回帰モデルの定義部分は下記の通りです*4

with pm.Model() as model_lr:
    tau = pm.Gamma('tau', alpha=1.0, beta=0.1)
    ws = pm.Normal('w', mu=0, tau=0.1, shape=nd+1)
    y = pm.Deterministic('y', pm.math.dot(ws, sample_x_feature))
    y_obs = pm.Normal('y_obs', mu=y, tau=tau, observed=sample_y)

登場する確率変数の確率分布を定義しているだけですね(めっちゃ簡単)。

細かくはnotebookを見ていただくとして、結果だけ示します。

f:id:hippy-hikky:20200313215527p:plain
線形回帰モデルのベイズ推論の結果.グレーの線は事後分布からサンプルした関数を描画したもの.赤線は関数の推論結果(期待値).青い線で設定値を描画.オレンジの点が学習データ.

真の関数として、二次関数を設定値として、そこから10点サンプルデータを取得しています(上図のオレンジの点)。二次関数からサンプルデータを取得しましたが、今回はちょっとイジワルで3次関数をフィッティングしてみました。

データが得られている領域はグレーの線が密集していますが、0未満や6付近は学習データが存在していないので、推論結果(グレーの線)がバラついており、予測の不確かさが現れています(それでも期待値はだいたい設定通り)。

【トップに戻る】

混合線形回帰モデル

前回の記事で混合モデルを扱いましたが、混合モデルは単純な確率分布の混合だけではないということを前回の記事でも書きました。混合モデルとは、コンポーネント(混合要素)を潜在変数sでスイッチングする構造を持ったモデルであり、非常に柔軟なモデルです。

ここでは、複数の線形モデルを組み合わせて、トレンドが複数あるデータのモデリングをやってみます。

グラフィカルモデルとしては、前回の混合モデルと上記の線形モデルを組み合わせただけですので、以下の通りです。

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

確率モデルを具体的に以下のように定義します。

f:id:hippy-hikky:20200313221609p:plain:h250

それぞれの確率変数に分布を設定しているだけで、特に難しいことはやっていません。 一点だけ注意ですが、以下の実際の推論では、コンポーネントの割り当てを決める変数sを周辺化除去し、計算を効率化しています。この点について詳しくは前回の記事を参照してください。PyMC3では、MixtureというAPIが用意されており、このAPIを利用すれば、勝手にsの周辺化除去をやってくれます。

パラメータ推論とその結果

詳しくは、添付のnotebookを参照してください。

今回実験に利用したデータは以下の通りです。

f:id:hippy-hikky:20200313220554p:plain
実験で使うサンプルデータ.二つの異なる2次関数からデータをサンプル.

二つの2次関数からデータをサンプルしてきています。下の方の関数からは10点、上の方からは50点ずつサンプルしています。

f:id:hippy-hikky:20200313220611p:plain
混合線形回帰モデルの推論結果.緑と赤の線が推論した線形モデルの各コンポーネントを示している.薄い線は事後分布からサンプルした関数を描画したもの.太い実線は関数の推論結果(期待値)を描画したもの.

推論結果を確認すると、期待通りに二つの線形回帰モデルが推論できていることがわかります。 今回も上記と同様に、真の関数は2次関数なのですが、3次関数をフィッティングしています。

【トップに戻る】

ということで実際のnotebook

【トップに戻る】

まとめ

今回は、線形回帰モデルを組み合わせた、「混合線形回帰モデル」のパラメータ推論をやってみました。

潜在的に複数の線形モデル(複数のクラス)が組み合わさっているようなデータはこのようなモデルを使ってモデリングすることが良いと思います*5。クラスの分割が容易であれば、あらかじめデータをクラス毎に分割して回帰モデルを学習しても良いのですが。。。実際うまくできるケースはそんなに多くないですからね。

またこのモデルを使っても、未知のデータのペア(x_*, y_*)がどちらのコンポーネントに属する可能性が高いのかといった、クラスタリングも可能です*6

混合モデルはかなり複雑なデータ構造も自由にモデリングできて面白いですね。次回は、混合モデルの混合数もデータから合わせて推論してみたいと思います。

【トップに戻る】

参考文献

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

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

【トップに戻る】

*1:ほぼ全て「回帰モデル」と言っても良いとも思いますが

*2:このような場合を「線形基底モデル」などと読んだりすることもありますが、

*3:ガウスノイズに限定する必要は全くありませんが、ここでは簡単のためにガウスノイズのケースしか考えないことにします。データの性質にしたがってガウスノイズで良いのかどうかは考える必要があります。

*4:解析解の導出など、結構計算がハードな部分ありますが、このように確率モデルを並べて書けるというのがPyMCはじめPPLを使う理由です。

*5:実は、過去に実案件でこのような問題を扱ったことがあり、まさにこの問題にぶち当たりました

*6:詳しくは前回のブログを参照下さい