0

我正在按照此处的教程在 gpflow 中实现更改点内核。但是,我有 3 个输入和 1 个输出,我希望更改点内核仅位于第一个输入维度上,而其他标准内核位于其他两个输入维度上。我收到以下错误:

InvalidArgumentError:不兼容的形状:[2000,3,1] 与 [3,2000,1] [Op:Mul] 名称:mul/

下面是一个最小的工作示例。谁能让我知道我哪里出错了?

gpflow 版本 2.0.0.rc1

import pandas as pd
import gpflow
from gpflow.utilities import print_summary


df_all = pd.read_csv(
    'https://raw.githubusercontent.com/ipan11/gp/master/dataset.csv')

# Training dataset in numpy format
X = df_all[['X1', 'X2', 'X3']].to_numpy()
Y1 = df_all['Y'].to_numpy().reshape(-1, 1)


# Changepoint kernel only on first dimension and standard kernels for the other two dimensions
base_k1 = gpflow.kernels.Matern32(lengthscale=0.2, active_dims=[0])
base_k2 = gpflow.kernels.Matern32(lengthscale=2., active_dims=[0])
k1 = gpflow.kernels.ChangePoints(
    [base_k1, base_k2], [.4], steepness=5)

k2 = gpflow.kernels.Matern52(lengthscale=[1., 1.], active_dims=[1, 2])
k_all = k1+k2
print_summary(k_all)

m1 = gpflow.models.GPR(data=(X, Y1), kernel=k_all, mean_function=None)
print_summary(m1)
opt = gpflow.optimizers.Scipy()


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


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

1 回答 1

1

正确的答案是将active_dims=[0]base_k* 内核移至 ChangePoints() 内核,

k1 = gpflow.kernels.ChangePoints([base_k1, base_k2], [0.4], steepness=5, active_dims=[0])

但目前 GPflow 2 不支持此功能,这是一个错误。我已经在 github 上打开了一个问题,一旦它被修复就会更新这个答案(如果你想尝试修复这个错误,请随时打开一个拉取请求,随时欢迎帮助!)。

于 2020-01-06T22:39:53.130 回答