我想构造一个多输出GP,其中输出之间的相关结构包含一个转换点。当只发生在Coregion核的相关结构中时,核本身(即长核和核族)在变化前后保持不变。
下面是示例(来自GPflow文档1.、2.和我自己的3)。其中:
X1 = np.random.rand(100, 1) # Observed locations for first output
X2 = np.random.rand(50, 1) * 0.5 # Observed locations for second output
Y1 = np.sin(6 * X1) + np.random.randn(*X1.shape) * 0.03
Y2 = np.sin(6 * X2 + 0.7) + np.random.randn(*X2.shape) * 0.1
# Augment the input with ones or zeros to indicate the required output dimension
X_augmented = np.vstack((np.hstack((X1, np.zeros_like(X1))),
np.hstack((X2, np.ones_like(X2)))))
# Augment the Y data with ones or zeros that specify a likelihood from the list of likelihoods
Y_augmented = np.vstack((np.hstack((Y1, np.zeros_like(Y1))),
np.hstack((Y2, np.ones_like(Y2)))))
output_dim = 2 # Number of outputs
rank = 1 # Rank of W
# Base kernel
k = gpflow.kernels.Matern32(active_dims=[0])
# Coregion kernel
coreg = gpflow.kernels.Coregion(output_dim=output_dim, rank=rank, active_dims=[1])
kern = k * coregbase_k1 = gpflow.kernels.Matern32(lengthscales=0.2)
base_k2 = gpflow.kernels.Matern32(lengthscales=2.0)
k = gpflow.kernels.ChangePoints([base_k1, base_k2], locations = [0.5], steepness=5.0)output_dim = 2 # Number of outputs
rank = 1 # Rank of W
# Base kernel
k_base = gpflow.kernels.Matern32(active_dims=[0])
# Coregion kernels
coreg_1 = gpflow.kernels.Coregion(output_dim=output_dim, rank=rank, active_dims=[1])
coreg_2 = gpflow.kernels.Coregion(output_dim=output_dim, rank=rank, active_dims=[1])
k_1 = k_base * coreg_1
k_2 = k_base * coreg_2
k = gpflow.kernels.ChangePoints([k_1, k_2], [0.5], steepness=50.0)
gpflow.set_trainable(k.locations, False); gpflow.set_trainable(k.steepness, False)当我试图适应这一点时,使用以下代码:
lik = gpflow.likelihoods.SwitchedLikelihood(
[gpflow.likelihoods.Gaussian(), gpflow.likelihoods.Gaussian()]
)
# now build the GP model as normal
m_change = gpflow.models.VGP((X_augmented, Y_augmented), kernel=k, likelihood=lik)
# fit the covariance function parameters
maxiter = ci_niter(10000)
gpflow.optimizers.Scipy().minimize(
m_change.training_loss, m_change.trainable_variables, options=dict(maxiter=maxiter), method="L-BFGS-B",
)我得到了“维数必须相等”的错误,我似乎无法做任何事情来纠正这一点。
我的问题是:
请注意:这是我的第一个问题。我曾尝试遵守指引,但如对我的问题有任何更改,使其更适合或更容易回答,请尽快提出。
发布于 2021-07-01 14:12:12
不幸的是,目前MultiOutput不支持GPflow中的ChangePoint内核。在您的示例中,这实际上意味着ChangePoint内核不知道要执行的输出的哪个维度,即使构成它的内核有它们的active_dims参数集。
我在工作中有一个拉请求来实现这个功能,您可以在这里找到:https://github.com/GPflow/GPflow/pull/1671
在该拉请求中提议的更改只需要在调用switch_dim内核时添加一个ChangePoint标志,如下所示:
k = gpflow.kernels.ChangePoints([k_1, k_2], locations=[0.5], steepness=50.0,
switch_dim=1) # <-- This one!如果您想尝试这个功能,您可以使用所建议的更改安装GPflow,例如使用如下所示的pip:
pip install git+https://github.com/GPflow/GPflow.git@refs/pull/1671/head或者,您可以在您的gpflow/kernels/changepoints.py源中定位GPflow,并手动实现在拉请求中找到的更改。
如果您决定这样做,请注意,这个提议的更改还没有经过广泛的测试,也不是GPflow的一个受支持的特性(尚未)。
关于第二个问题,目前设置模型的方式只适用于ChangePoint之前和之后的一个母内核,因为您对k_1和k_2都使用相同的k_base实例。这意味着你已经在CP的两侧安装了相同的长度,这似乎是你正在寻找的设置。
https://stackoverflow.com/questions/68209521
复制相似问题