регрессия гауссовского процесса в нескольких измерениях с помощью GPflow - PullRequest
3 голосов
/ 04 февраля 2020

Я хотел бы выполнить некоторую многовариантную регрессию с использованием гауссовой регрессии процесса, как это реализовано в GPflow с использованием версии 2. Установлено с pip install gpflow==2.0.0rc1

Ниже приведен пример кода, который генерирует некоторые 2D-данные и затем пытается их подогнать. с использованием георадара и, наконец, вычисляет разницу между истинными входными данными и прогнозом георадара.

В конце концов, я хотел бы перейти к более высоким измерениям и провести тесты с набором валидации, чтобы проверить их на подгонку и поэкспериментировать с другие ядра и «Автоматизация c Определение релевантности», но понимание того, как заставить это работать, является первым шагом.

Спасибо!

Следующий фрагмент кода будет работать в блокноте Jupyter.

import gpflow
import numpy as np
import matplotlib
from gpflow.utilities import print_summary

%matplotlib inline
matplotlib.rcParams['figure.figsize'] = (12, 6)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def gen_data(X, Y):
    """
    make some fake data.
    X, Y are np.ndarrays with shape (N,) where
    N is the number of samples.
    """

    ys = []
    for x0, x1 in zip(X,Y):
        y = x0 * np.sin(x0*10)
        y = x1 * np.sin(x0*10)
        y += 1
        ys.append(y)
    return np.array(ys)


# generate some fake data
x = np.linspace(0, 1, 20)
X, Y = np.meshgrid(x, x)

X = X.ravel()
Y = Y.ravel()

z = gen_data(X, Y)

#note X.shape, Y.shape and z.shape
#are all (400,) for this case.

# if you would like to plot the data you can do the following
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(X, Y, z, s=100, c='k')


# had to set this 
# to avoid the following error
# tensorflow.python.framework.errors_impl.InvalidArgumentError: Cholesky decomposition was not successful. The input might not be valid. [Op:Cholesky]
gpflow.config.set_default_positive_minimum(1e-7)

# setup the kernel

k = gpflow.kernels.Matern52()


# set up GPR model

# I think the shape of the independent data
# should be (400, 2) for this case
XY = np.column_stack([[X, Y]]).T
print(XY.shape) # this will be (400, 2)

m = gpflow.models.GPR(data=(XY, z), kernel=k, mean_function=None)

# optimise hyper-parameters
opt = gpflow.optimizers.Scipy()

def objective_closure():
    return - m.log_marginal_likelihood()

opt_logs = opt.minimize(objective_closure,
                        m.trainable_variables,
                        options=dict(maxiter=100)
                       )


# predict training set
mean, var = m.predict_f(XY)

print(mean.numpy().shape)
# (400, 400)
# I would expect this to be (400,)

# If it was then I could compute the difference
# between the true data and the GPR prediction
# `diff = mean - z`
# but because the shape is not as expected this of course
# won't work.


1 Ответ

2 голосов
/ 10 февраля 2020

Форма z должна быть (N, 1), тогда как в вашем случае это (N,). Тем не менее, это пропущенная проверка в GPflow, а не ваша ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...