Как уже упоминалось здесь , регрессия Гаусса (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()