GPFlow: как учесть неопределенности из средней модели - PullRequest
0 голосов
/ 24 марта 2020

В GPFlow можно добавить функцию усредненного среднего к регрессии GP. При выполнении этого, как в базовом c примере , результат состоит в том, что не будет неопределенностей из-за неопределенности в подгонке среднего. Например, в приведенном ниже примере столбцы ошибок не выходят за пределы диапазона доступных данных, поскольку наклон линейного среднего значения остается фиксированным при его оптимизированном значении. Есть ли способ учесть эти неопределенности, так что полосы ошибок увеличиваются при экстраполяции?

(вопрос был первоначально задан в отчете о проблеме , но перенесен сюда, чтобы быть более доступным)

enter image description here

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

def f(x):
    return np.sin(3*x) + x

xtrain = np.linspace(0, 3, 50).reshape([-1, 1])
ytrain = f(xtrain) + 0.5*(np.random.randn(len(xtrain)).reshape([-1, 1]) - 0.5)

k = gpflow.kernels.SquaredExponential()
meanf = gpflow.mean_functions.Linear()
m = gpflow.models.GPR(data=(xtrain, ytrain), kernel=k, mean_function=meanf)
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))

print_summary(m)


xpl = np.linspace(-5, 10, 100).reshape(100, 1)
mean, var = m.predict_f(xpl)

plt.figure(figsize=(12, 6))
plt.plot(xtrain, ytrain, 'x')
plt.plot(xpl, mean, 'C0', lw=2)
plt.fill_between(xpl[:, 0],
                 mean[:, 0] - 1.96 * np.sqrt(var[:,0]),
                 mean[:, 0] + 1.96 * np.sqrt(var[:,0]),
                 color='C0', alpha=0.2)

1 Ответ

1 голос
/ 24 марта 2020

Большинство моделей GPflow оптимизируют только для оценки MAP гиперпараметров ядра, средней функции и вероятности. Модели не учитывают неопределенность этих гиперпараметров во время обучения или прогнозирования. Хотя это может быть ограничением для определенных задач, мы часто обнаруживаем, что это разумный компромисс между вычислительной сложностью и количественным определением неопределенности. может объяснить неопределенность в линейном тренде данных, указав линейную функцию ядра, а не функцию линейного среднего.

Использование вашего фрагмента с данной спецификацией модели:

k = gpflow.kernels.SquaredExponential() + gpflow.kernels.Linear()
meanf = gpflow.mean_functions.Zero()  
m = gpflow.models.GPR(data=(xtrain, ytrain), kernel=k, mean_function=meanf)

Дает после подбора, с барами ошибок, которые выходят за пределы диапазона данных: Fit GPR with Squared Exponential and Linear kernel

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