Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高斯过程(Python)_Python_Process_Gaussian_Sampling - Fatal编程技术网

高斯过程(Python)

高斯过程(Python),python,process,gaussian,sampling,Python,Process,Gaussian,Sampling,我使用以下代码创建并采样了平均值为0的高斯先验值: import numpy as np import matplotlib.pyplot as plt from math import pi from scipy.spatial.distance import cdist import scipy.stats as sts x_prior = np.linspace(-10,10,101) x_prior = x_prior.reshape(-1,1) mu = np.zeros(x_p

我使用以下代码创建并采样了平均值为0的高斯先验值:

import numpy as np
import matplotlib.pyplot as plt 
from math import pi 
from scipy.spatial.distance import cdist
import scipy.stats as sts

x_prior = np.linspace(-10,10,101)
x_prior = x_prior.reshape(-1,1)
mu = np.zeros(x_prior.shape)

#defining the Kernel for the covariance function

def sec(a,b, length_scale , sigma) : 
    K = sigma * np.exp(-1/(2*length_scale) * cdist(a,b)**2)
    return K 

#defining the Gaussian Process prior

def GP(a , b, mu , kernel , length_scale, sigma , samples ) :
    f = np.random.multivariate_normal(mu.flatten(), kernel(a ,b , length_scale , sigma ) , samples)
    return f

prior = GP(x_prior ,x_prior, mu , sec , 100, 1 , 5)

plt.figure()
plt.grid()
plt.title('samples from the Gaussian prior')
plt.plot(x_prior , prior.T)
plt.show()

然后,当加入一些“观察”数据时,我希望计算这些点的后验值,但这就是我陷入困境的地方

以下是我介绍新数据的代码:

x_train = np.array([-10,-8,5,-1,2])
x_train = x_train.reshape(-1,1)
def straight_line(m , x , c):
    y = 5*x + c
    return y
ytrain = straight_line(5 , x_train , 0)
我的理解是,给定与观测数据相关的先前和新x值,计算新数据的条件分布

然后,您是否希望通过对平均值进行某种更改以包括新的y值来更新多元变量,使其变为后验变量

我已使用以下资源尝试此操作:

但我真的在努力了解每个阶段都会发生什么,为什么,这样当我得到一个后路(我做不到)时,我就能确切地知道我是如何到达那里的

以下是我一直在尝试实施的一些解决方案,但到目前为止没有效果:

K_train = sec(x_train , x_train , 1,1)
K_prior = sec(x_prior , x_prior , 1,1)
K_pt =  sec(x_prior , x_train , 1,1)
K_tp = sec(x_train , x_prior ,  1,1)  ## = k_tp transpose
prior = sts.multivariate_normal(mu.flatten(), K_prior) 
#mean_test = np.dot(K_p , np.linalg.inv(K_prior))
mean_function = np.dot(np.dot(K_tp ,np.linalg.inv(K_prior).T) , prior )
covariance_function = K_train - np.dot(np.dot(K_tp ,np.linalg.inv(K_prior).T) , K_pt) 

只是给看过这篇文章的人的更新。通过阅读本文,我找到了解决方案:

以及以下代码:

mean_function = np.dot(np.dot(K_pt ,np.linalg.inv(K_train)), ytrain) 

covariance_function = K_prior - np.dot(np.dot(K_pt ,np.linalg.inv(K_train)) , K_tp) 

f = np.random.multivariate_normal(mean_function[:,0],covariance_function , 100)

式中,f是后关节高斯分布,您可以从中采样,仅用于额外的随访。我已在此处将代码写入Juypeter格式:

与此处相关的通读材料:

以防有人想通过这种材料工作,像我一样陷入困境