首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPflow多输出变化点

GPflow多输出变化点
EN

Stack Overflow用户
提问于 2021-07-01 11:40:43
回答 1查看 155关注 0票数 0

我想构造一个多输出GP,其中输出之间的相关结构包含一个转换点。当只发生在Coregion核的相关结构中时,核本身(即长核和核族)在变化前后保持不变。

下面是示例(来自GPflow文档1.、2.和我自己的3)。其中:

  1. 输出之间有关联结构,但没有变化点,
  2. 演示如何在GPflow中构造转换点,
  3. 我试图在包含更改点的输出之间建立关联结构。
代码语言:javascript
复制
    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 * coreg
代码语言:javascript
复制
base_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)
代码语言:javascript
复制
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)

当我试图适应这一点时,使用以下代码:

代码语言:javascript
复制
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",
)

我得到了“维数必须相等”的错误,我似乎无法做任何事情来纠正这一点。

我的问题是:

  1. 我怎样才能使这个型号适合呢?
  2. 在当前状态下,我认为这个设置在转换点前后适合不同的长尺度,而我只希望输出中的相关结构发生变化。如何将长度设置为相同的可训练参数?

请注意:这是我的第一个问题。我曾尝试遵守指引,但如对我的问题有任何更改,使其更适合或更容易回答,请尽快提出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 14:12:12

不幸的是,目前MultiOutput不支持GPflow中的ChangePoint内核。在您的示例中,这实际上意味着ChangePoint内核不知道要执行的输出的哪个维度,即使构成它的内核有它们的active_dims参数集。

我在工作中有一个拉请求来实现这个功能,您可以在这里找到:https://github.com/GPflow/GPflow/pull/1671

在该拉请求中提议的更改只需要在调用switch_dim内核时添加一个ChangePoint标志,如下所示:

代码语言:javascript
复制
k = gpflow.kernels.ChangePoints([k_1, k_2], locations=[0.5], steepness=50.0,
                                switch_dim=1) # <-- This one!

如果您想尝试这个功能,您可以使用所建议的更改安装GPflow,例如使用如下所示的pip

代码语言:javascript
复制
pip install git+https://github.com/GPflow/GPflow.git@refs/pull/1671/head

或者,您可以在您的gpflow/kernels/changepoints.py源中定位GPflow,并手动实现在拉请求中找到的更改。

如果您决定这样做,请注意,这个提议的更改还没有经过广泛的测试,也不是GPflow的一个受支持的特性(尚未)。

关于第二个问题,目前设置模型的方式只适用于ChangePoint之前和之后的一个母内核,因为您对k_1k_2都使用相同的k_base实例。这意味着你已经在CP的两侧安装了相同的长度,这似乎是你正在寻找的设置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68209521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档