ベイズ推論により混合分布のパラメータ推論をやってみる 〜線形回帰モデルの混合〜
【概要】
- 混合分布(混合モデル)はモデルを潜在変数でスイッチする構造を持ったモデルであり、実用的な観点でも面白いです
- 弊ブログでは数回にわたって、混合分布を使って遊んでみています(これが3記事目)
- 第3弾では、線形回帰モデルのパラメータ推論(ベイズ線形回帰)と線形回帰モデルを混合したモデルの推論をやってみます
【目次】
はじめに
機械学習や統計の問題では、手元にあるデータを解釈して応用しようとしますね。 この時、明に暗になんらかの「確率モデル」を仮定しているはずです。
確率モデルの中でも、混合分布(混合モデル)は、複数の確率モデルの組み合わせとして定義されており、複雑なデータ構造を表現できます。 応用としても、クラス分類や多クラスの回帰など面白い実用例があります。
ということで数回にわたって、混合モデルを使って遊んでみたいと思います。
第3弾となる本記事では、線形回帰モデルをベイズ推論でパラメータ推論する、いわゆるベイズ線形回帰と線形回帰モデルを混合したモデル(ここでは、「混合線形回帰モデル」と呼ぶことにします)の推論をやってみます。
【ベイズ推論により混合分布のパラメータ推論をやってみる 記事一覧】
第3弾:当記事
第4弾:
learning-with-machine.hatenablog.com
ベイズ線形回帰
回帰モデルは機械学習の問題ではよく出てくるモデルですね*1。
回帰モデルは、データがデータと確率変数に依存する構造です(下図)。を説明変数、 を目的変数、を重みパラメータなど呼ぶことが多いかもしれません。また、データをそのまま使うのではなく、n次関数などのなんらかの関数を通すことも多いですね*2。このような操作を特に「特徴抽出」と呼んだりします。
データはN個のペアとして与えられるもので、未知の変数をのペアに基づいて推論することが目的です。
はとのなんらかの関数を平均としたガウスノイズが付加されて観測されるものとします*3。 は、にM個の関数を通して得られる値との線型結合とします。
が推論できれば、未知の入力変数に対するを推論することができます。
線形回帰のベイズ推論については、解析解を求めることができます。詳しくは下記参考資料を参照してください。弊ブログでもソースコード付きで記事を公開していますので、興味があればこちらもご覧ください。
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を見ていただくとして、結果だけ示します。
真の関数として、二次関数を設定値として、そこから10点サンプルデータを取得しています(上図のオレンジの点)。二次関数からサンプルデータを取得しましたが、今回はちょっとイジワルで3次関数をフィッティングしてみました。
データが得られている領域はグレーの線が密集していますが、0未満や6付近は学習データが存在していないので、推論結果(グレーの線)がバラついており、予測の不確かさが現れています(それでも期待値はだいたい設定通り)。
混合線形回帰モデル
前回の記事で混合モデルを扱いましたが、混合モデルは単純な確率分布の混合だけではないということを前回の記事でも書きました。混合モデルとは、コンポーネント(混合要素)を潜在変数でスイッチングする構造を持ったモデルであり、非常に柔軟なモデルです。
ここでは、複数の線形モデルを組み合わせて、トレンドが複数あるデータのモデリングをやってみます。
グラフィカルモデルとしては、前回の混合モデルと上記の線形モデルを組み合わせただけですので、以下の通りです。
確率モデルを具体的に以下のように定義します。
それぞれの確率変数に分布を設定しているだけで、特に難しいことはやっていません。 一点だけ注意ですが、以下の実際の推論では、コンポーネントの割り当てを決める変数を周辺化除去し、計算を効率化しています。この点について詳しくは前回の記事を参照してください。PyMC3では、MixtureというAPIが用意されており、このAPIを利用すれば、勝手にの周辺化除去をやってくれます。
パラメータ推論とその結果
詳しくは、添付のnotebookを参照してください。
今回実験に利用したデータは以下の通りです。
二つの2次関数からデータをサンプルしてきています。下の方の関数からは10点、上の方からは50点ずつサンプルしています。
推論結果を確認すると、期待通りに二つの線形回帰モデルが推論できていることがわかります。 今回も上記と同様に、真の関数は2次関数なのですが、3次関数をフィッティングしています。
ということで実際のnotebook
まとめ
今回は、線形回帰モデルを組み合わせた、「混合線形回帰モデル」のパラメータ推論をやってみました。
潜在的に複数の線形モデル(複数のクラス)が組み合わさっているようなデータはこのようなモデルを使ってモデリングすることが良いと思います*5。クラスの分割が容易であれば、あらかじめデータをクラス毎に分割して回帰モデルを学習しても良いのですが。。。実際うまくできるケースはそんなに多くないですからね。
またこのモデルを使っても、未知のデータのペアがどちらのコンポーネントに属する可能性が高いのかといった、クラスタリングも可能です*6。
混合モデルはかなり複雑なデータ構造も自由にモデリングできて面白いですね。次回は、混合モデルの混合数もデータから合わせて推論してみたいと思います。
参考文献
機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)
- 作者:須山 敦志
- 発売日: 2017/10/21
- メディア: 単行本(ソフトカバー)
- 作者:C.M. ビショップ
- 発売日: 2012/04/05
- メディア: 単行本(ソフトカバー)
- 作者:C.M. ビショップ
- 発売日: 2012/02/29
- メディア: 単行本
Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド
- 作者:マーティン,オズワルド
- 発売日: 2018/06/22
- メディア: 単行本
*1:ほぼ全て「回帰モデル」と言っても良いとも思いますが
*2:このような場合を「線形基底モデル」などと読んだりすることもありますが、
*3:ガウスノイズに限定する必要は全くありませんが、ここでは簡単のためにガウスノイズのケースしか考えないことにします。データの性質にしたがってガウスノイズで良いのかどうかは考える必要があります。
*4:解析解の導出など、結構計算がハードな部分ありますが、このように確率モデルを並べて書けるというのがPyMCはじめPPLを使う理由です。
*5:実は、過去に実案件でこのような問題を扱ったことがあり、まさにこの問題にぶち当たりました
*6:詳しくは前回のブログを参照下さい