Гауссова регрессия прогресса: неверный прогноз - PullRequest
0 голосов
/ 04 февраля 2020

мои данные состоят из 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 до и после тренировки:

enter image description here

1 Ответ

0 голосов
/ 28 марта 2020

Вы можете исправить свою дисперсию правдоподобия, чтобы она не была обучаемой с

gpflow.utilities.set_trainable(m.likelihood.variance, False)

enter image description here

Но лучшим подходом было бы просто отключить ядро, так как твое кажется неадекватным.


k1 = gpflow.kernels.SquaredExponential(lengthscales = [0.1], active_dims=[0])
k2 = gpflow.kernels.SquaredExponential(lengthscales = [0.1], active_dims=[1])

m = gpflow.models.GPR(data=(X, Y), kernel=k1+k2)


m.likelihood.variance.assign(0.01)

...