мои данные состоят из x
и y
длины 10. Я хочу обучить моего GP, чтобы он мог предсказать соответствующее z
. Но каким-то образом после обучения прогнозируемое значение z
сильно отличается от того, каким оно должно быть. До сих пор я пробовал разные ядра с разными масштабами длины, но прогноз все еще слишком сильно отличается. Буду очень признателен за любые советы и рекомендации.
import gpflow
import numpy as np
import matplotlib
from gpflow.utilities import print_summary
import math
import socket
import pickle
import time
import matplotlib.pyplot as plt
import select
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from matplotlib.collections import PolyCollection
import matplotlib.pyplot as plt
from matplotlib import colors as mcolors
from mpl_toolkits.mplot3d import Axes3D
def objective_closure():
return - m.log_marginal_likelihood()
x =[9.953, 15.12, 20.29, 25.44, 30.6, 35.74, 40.88, 46.01, 51.14, 56.26]
y =[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
z =[100.5619, 99.8705, 98.7587, 97.2267, 95.2744, 92.9017, 90.1087, 86.8954, 83.2618, 79.2079]
x_np= np.reshape(x[0:10],(-1,1))
y_np= np.reshape(y[0:10],(-1,1))
z_np= np.reshape(z[0:10],(-1,1))
X = np.array([x_np, y_np]).T[0]
Y = z_np
k = gpflow.kernels.SquaredExponential()
m = gpflow.models.GPR(data=(X, Y), kernel=k)
m.likelihood.variance.assign(0.01)
m.kernel.lengthscale.assign(0.1)
print_summary(m)
opt = gpflow.optimizers.Scipy()
opt_logs = opt.minimize(objective_closure,
m.trainable_variables,
options=dict(maxiter=100))
print_summary(m)
################################################################## Done with generating GPR
## generate samples
xx = np.linspace(x_np.min(), x_np.max(), 2).reshape(-1, 1) # test points must be of shape (N, D)
yy = np.linspace(y_np.min(), y_np.max(), 2).reshape(-1, 1) # test points must be of shape (N, D)
test_points = np.array([xx, yy]).T[0]
## predict mean and variance of latent GP at test points
mean, var = m.predict_f(test_points)
## generate 10 samples from posterior
samples = m.predict_f_samples(test_points, 2)
###########plot
ax = plt.axes(projection="3d")
ax.scatter3D(X[:,0],X[:,1], Y, cmap='hsv')
for idx,val in enumerate(samples):
ax.scatter3D(xx,yy,samples[idx], c="black")
ax.set_xlabel('X_axis')
ax.set_ylabel('Y_axis')
ax.set_zlabel('Z_axis')
plt.show()
График набора данных, используемого для обучения ( Синий ) и прогнозируемое значение ( Черный ).
Параметры модели GP до и после тренировки: