Как определить априор для регрессии Гауссовского процесса в scikit-learn? - PullRequest
0 голосов
/ 01 марта 2019

Как уже упоминалось здесь , регрессия Гаусса (GPR) в Scikit-Learn позволяет «прогнозировать без предварительной подгонки (на основе предшествующей GP)».Но у меня есть представление о том, каким должен быть мой предыдущий (т.е. он должен иметь не просто нулевое среднее значение, а, возможно, мой вывод y, линейно масштабируемый с моим вводом X, т.е. y = X).Как я могу закодировать эту информацию в GPR?

Ниже приведен рабочий пример, но для моего априора он принимал нулевое среднее.Я прочитал , что "GaussianProcessRegressor не позволяет задавать функцию среднего значения, всегда предполагая, что она является нулевой функцией, подчеркивая уменьшенную роль функции среднего в вычислении апостериорного значения".Я полагаю, что это мотивация пользовательских ядер (например, гетероскедастических) с переменным масштабом на разных X, хотя я все еще пытаюсь лучше понять, какие возможности они предоставляют.Существуют ли способы обойти нулевое среднее значение априора, чтобы в scikit-learn можно было указать произвольный априор?

import numpy as np
from matplotlib import pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C

def f(x):
    """The function to predict."""
    return 1.5*(1. - np.tanh(100.*(x-0.96))) + 1.5*x*(x-0.95) + 0.4 + 1.5*(1.-x)* np.random.random(x.shape)

# Instantiate a Gaussian Process model
kernel = C(10.0, (1e-5, 1e5)) * RBF(10.0, (1e-5, 1e5))

X = np.array([0.803,0.827,0.861,0.875,0.892,0.905,
                0.91,0.92,0.925,0.935,0.941,0.947,0.96,
                0.974,0.985,0.995,1.0])
X = np.atleast_2d(X).T

# Observations and noise
y = f(X).ravel() 
noise = np.linspace(0.4,0.3,len(X))
y += noise

# Instantiate a Gaussian Process model
gp = GaussianProcessRegressor(kernel=kernel, alpha=noise ** 2,
                              n_restarts_optimizer=10)
# Fit to data using Maximum Likelihood Estimation of the parameters
gp.fit(X, y)

# Make the prediction on the meshed x-axis (ask for MSE as well)
x = np.atleast_2d(np.linspace(0.8, 1.02, 1000)).T
y_pred, sigma = gp.predict(x, return_std=True)

plt.figure() 
plt.errorbar(X.ravel(), y, noise, fmt='k.', markersize=10, label=u'Observations')
plt.plot(x, y_pred, 'k-', label=u'Prediction')
plt.fill(np.concatenate([x, x[::-1]]),
         np.concatenate([y_pred - 1.9600 * sigma,
                        (y_pred + 1.9600 * sigma)[::-1]]),
         alpha=.1, fc='k', ec='None', label='95% confidence interval')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(0.8, 1.02)
plt.ylim(0, 5)
plt.legend(loc='lower left')
plt.show()
...