ガウス過程回帰とは pythonでの実装例



確率・統計

統計/解析

ベイズ理論

確率

公開日:2021/11/6  最終更新日:2023/2/9        

 ・In English
前提知識
 ・カーネル回帰


■ガウス過程回帰とは

データ数が少ない状態で回帰させたときに、対象となるモデルに対して精度よくフィッティングさせる関数を設定できない場合があります。 このとき得られたデータから関数をより良い精度に更新させていく手法をノンパラメトリック回帰といいます。

ガウス過程とはノンパラメトリック回帰モデルの一種で、回帰モデルによって得られた値がガウス分布に従って幅を持つというものです。データの数が少ない場合はガウス分布の分散が大きく、データの数が多くなるに従いデータの信頼性が高まるためガウス分布の分散が小さくなります。

■ガウス過程回帰のpythonによる実装例

ガウス過程回帰はカーネル回帰が考え方のベースになっている事から、先ずはカーネル回帰の実装例を確認ください。

実施した環境とライブラリは以下のとおり。

 ・python ver:3.9
 ・必要なライブラリ:numpy, matplotlib, itertools インストール方法

import numpy as np
from matplotlib import pyplot as plt
from itertools import product

def kernel(x, xd):    # カーネル関数
    K = np.zeros([len(x), len(xd)])
    for i, j in product(range(len(x)), range(len(xd))):
        K[i][j] = theta[0]*np.exp(-1*(x[i] - xd[j])**2 /theta[1])+(theta[2]*int(x[i]==xd[j]))
    return K

N = 20            # サンプル数
theta = np.array([1, 0.4, 0.1])        # 係数
X_smpl = np.random.uniform(-2*3.14, 2*3.14, N)    # サンプルX値
Y_smpl = np.sin(X_smpl)        # サンプルY値
X_est = np.linspace(-2*3.14, 2*3.14, 100)    # 推定したいX値
std = np.zeros([len(X_est)])        # 標準偏差

K = kernel(X_smpl, X_smpl)
W = np.dot(np.linalg.inv(K), Y_smpl)        # パラメータ
k = kernel(X_est, X_smpl)
mu = np.dot(k, W)        # 平均値
KK = np.dot(k, np.linalg.inv(K))
for i in range(len(X_est)):
    std[i] = np.sqrt(theta[0] + theta[2] - np.dot(KK[i], k[i].T))    # 標準偏差

plt.scatter(X_smpl, Y_smpl)
plt.plot(X_est, np.sin(X_est), c='blue')
plt.plot(X_est, mu, color='red')        # 平均値のプロット
plt.fill_between(X_est, mu + std, mu - std, alpha=.2, color='green')    # 回帰の信頼性(標準偏差)を範囲化
plt.show()


<プログラム実行結果>
結果は以下のとおり、ガウスカーネル回帰との比較を表しています。 ガウス過程回帰は、プロット点が少ない領域はデータの信頼性が無いと捉えて、推定値の幅(緑の領域)を大きくします。逆にプロット点が多い領域は推定値の幅を小さくします。











サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



確率・統計

統計/解析

ベイズ理論

確率