我正在尝试在 gpflow 中实现我自己的 MultioutputKernel (MOK),但是我被困在 Multiple Dispatch 的(Kernel, Inducing Variable)
组合中。
根据docsMultioutputKernel
,组合 a with的后备方法InducingPoints
应该是调用fully_correlated_conditional
(via gpf.conditionals.multioutput.inducing_point_conditional
)。
但是,我无法让任何 MOK 与非独立诱导变量一起工作,甚至是预先实现的变量。这是一个最低限度的不工作示例SharedIndependent
:
######################## toy data
d = 1
X = np.random.normal(0, 10, (100, d))
xx = np.linspace(-10, 10, 200).reshape(-1, 1)
f = lambda x: x ** 2
f_ = lambda x: 2 * x
Y = f(X)
Y_ = f_(X)
Y_combined = np.hstack((Y, Y_))
data = (X, Y_combined)
######################### gpflow stuff
kernel = gpf.kernels.RBF(lengthscales=[1.0] * d)
Z = X.copy()
# create multi-output inducing variables from Z
iv = gpf.inducing_variables.InducingPoints(Z)
MOK_K = gpf.kernels.SharedIndependent(kernel, output_dim=2)
m = gpf.models.SVGP(likelihood=gpf.likelihoods.Gaussian(), kernel=MOK_K, num_latent_gps=2,
inducing_variable=iv)
optimizer = gpf.optimizers.Scipy()
optimizer.minimize(
m.training_loss_closure(data),
variables=m.trainable_variables,
method="l-bfgs-b",
options={"disp": True, "maxiter": 1000},
)
这是行不通的,除非有人用
iv = gpf.inducing_variables.SharedIndependentInducingVariables(
gpf.inducing_variables.InducingPoints(Z)
)
但是对于我的自定义非独立内核,我需要完全相关的条件。我得到的错误是
ValueError: base_conditional() arguments [Note that this check verifies the shape of an alternative representation of Kmn. See the docs for the actual expected shape.]
在inducing_point_conditional
将内核矩阵传递给base_conditional
. 但是,我不明白哪里出了问题,因为形状应该没问题。它们就像文档中定义的那样。
我必须改变什么才能让它在完全相关的条件下运行?