「Pythonによるベイズ統計モデリング」まとめ #5
「Pythonによるベイズ統計モデリング―PyMCでのデータ分析実践ガイド― 」:
Pythonによるベイズ統計モデリング: PyMCでのデータ分析実践ガイド
- 作者: オズワルドマーティン,Osvaldo Martin,金子武久
- 出版社/メーカー: 共立出版
- 発売日: 2018/06/22
- メディア: 単行本
- この商品を含むブログを見る
前回↓
#5では第8章を扱う。
第8章 ガウス過程
ここからはノンパラメトリックモデルを扱う。
カーネル
カーネルベースの手法として,サポートベクトルマシンとガウス過程がある。ここではガウス過程について扱う。
線形回帰モデル:
(:誤差)
ここで は係数ベクトル,はデータを示す。
多項式回帰モデルは
と表される。関数をカーネルで置き換えると,
となる。ここでデータに対して,はノットと呼ばれる。
実装例としては重み空間モデルが扱われる。これはグリッド点としての値を近似する曲線を得るグリッドアプローチである。
データの表示
import pymc3 as pm import numpy as np import pandas as pd import theano.tensor as tt import scipy.stats as stats import matplotlib.pyplot as plt import seaborn as sns plt.style.use(['seaborn-colorblind', 'seaborn-darkgrid']) np.set_printoptions(precision=2) np.random.seed(1) x = np.random.uniform(0, 10, size=20) y = np.random.normal(np.sin(x), 0.2) plt.plot(x, y, 'o') plt.xlabel('$x$', fontsize=16) plt.ylabel('$f(x)$', fontsize=16, rotation=0) plt.figure()
モデル記述
def gauss_kernel(x, n_knots): knots = np.linspace(x.min(), x.max(), n_knots) w = 2 return np.array([np.exp(-(x-k)**2/w) for k in knots]) n_knots = 5 with pm.Model() as kernel_model: gamma = pm.Cauchy('gamma', alpha=0, beta=1, shape=n_knots) sd = pm.Uniform('sd',0, 10) mu = pm.math.dot(gamma, gauss_kernel(x, n_knots)) yl = pm.Normal('yl', mu=mu, sd=sd, observed=y) kernel_trace = pm.sample(5000, njobs=1) pm.traceplot(kernel_trace) plt.figure()
事後予測チェック
ppc = pm.sample_ppc(kernel_trace, model=kernel_model, samples=100) plt.plot(x, ppc['yl'].T, 'ro', alpha=0.1) plt.plot(x, y, 'bo') plt.xlabel('$x$', fontsize=16) plt.ylabel('$f(x)$', fontsize=16, rotation=0) plt.figure()
データ適合性チェック
new_x = np.linspace(x.min(), x.max(), 100) k = gauss_kernel(new_x, n_knots) gamma_pred = kernel_trace['gamma'] for i in range(100): idx = np.random.randint(0, len(gamma_pred)) y_pred = np.dot(gamma_pred[idx], k) plt.plot(new_x, y_pred, 'r-', alpha=0.1) plt.plot(x, y, 'bo') plt.xlabel('$x$', fontsize=16) plt.ylabel('$f(x)$', fontsize=16, rotation=0) plt.figure()
このように,カーネルを用いることで非線形データのモデリングができる。
ガウス過程
ガウス過程は多変量正規分布を無限にまで拡張したものであり, 平均関数と共分散関数によってパラメータ化される。
事前分布,尤度,事後分布は以下のようになる。
- 事前分布:
- 尤度:
- 事後分布:
データが周期的な可能性が ある場合は,周期カーネルを使うのがよい。例としてsin関数を含んだものを示す。
(終)