我遵循教程这里在gpflow中实现变更点内核。但是,我有3个输入和1个输出,我希望转换点内核仅位于第一个输入维度上,而其他标准内核则位于其他两个输入维度上。我得到了以下错误:
InvalidArgumentError:不兼容的形状: 2000,3,1 vs. 3,2000,1名: 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))发布于 2020-01-06 22:39:53
正确的答案是将active_dims=[0]从base_k*内核移到ChangePoints()内核,
k1 = gpflow.kernels.ChangePoints([base_k1, base_k2], [0.4], steepness=5, active_dims=[0])但是,GPflow 2目前不支持这一点,这是一个bug。我已经打开了一个github问题,一旦它被修复了,我会更新这个答案(如果您想要修复这个错误,请随时打开拉请求,帮助总是欢迎的!)
https://stackoverflow.com/questions/59613675
复制相似问题