2017-09-21 10 views
1

ガウスプロセスでカーネルが与えられた場合、最初にサンプリングすることなく、前の分布から引き出される関数の形状を知ることは可能ですか?ガウスプロセスにおけるカーネル関数

+0

私は私はあなたの質問を理解していません。 GPにはいくつの観測がありますか?関数が前の関数からサンプリングされているとすれば、GPはどのようにそれに影響しますか?また、形はどういう意味ですか? – Maxim

+0

あなたはそれが正しいです!サンプリングされた関数は事前に描画され、GPに依存しません。私は、事前に、平均がゼロの多変量ガウス分布と共分散行列(カーネルによって定義されている)であると仮定しています。今度は、カーネルに指数関数的またはブラウン運動の二乗を言うようになります。サンプリングされた関数がどれほど滑らかであるか、あるいは変化するかを知ることは可能でしょうか? f〜N(0、\ sigma)ここで\ sigmaは共分散行列であり、カーネルの定義によって計算される。 –

+0

すみません。私の答えを見てください。 – Maxim

答えて

0

私は先の関数の形を知る最良の方法は、それらを描画することだと思います。ここでは1次元の例は次のとおり

prior samples

これらはGPからのサンプルである前(平均二乗指数カーネルによって誘導される0及び共分散行列です)。あなたが見ているように、彼らは滑らかであり、一般的に、彼らがどのように "揺れる"かの感覚を与えます。また、マルチディメンションの場合は、それぞれがこのように見えることに注意してください。

ここで私が使用し、完全なコードです、独自のカーネルを書いたり、それがサンプルにどのように影響するかを確認するためにパラメータを微調整して自由に感じる:

import numpy as np 
import matplotlib.pyplot as pl 

def kernel(a, b, gamma=0.1): 
    """ GP squared exponential kernel """ 
    sq_dist = np.sum(a**2, 1).reshape(-1, 1) + np.sum(b**2, 1) - 2*np.dot(a, b.T) 
    return np.exp(-0.5 * (1/gamma) * sq_dist) 

n = 300  # number of points. 
m = 10  # number of functions to draw. 
s = 1e-6  # noise variance. 

X = np.linspace(-5, 5, n).reshape(-1, 1) 
K = kernel(X, X) 
L = np.linalg.cholesky(K + s * np.eye(n)) 
f_prior = np.dot(L, np.random.normal(size=(n, m))) 

pl.figure(1) 
pl.clf() 
pl.plot(X, f_prior) 
pl.title('%d samples from the GP prior' % m) 
pl.axis([-5, 5, -3, 3]) 
pl.show() 
関連する問題