GPflow 多输出变化点

问题描述

我想构建一个输出GP,其中输出间的相关结构包含一个变化点。更改应该发生在 Coregion 内核的相关结构中,而内核本身(即长度尺度和内核族)在更改前后应该保持不变。

下面,我包含了一些示例(来自 GPflow 文档 [1.,2.] 和我自己的 [3.]):

  1. 输出之间有相关结构,但没有变化点,
  2. 演示如何在 GPflow 中构建变更点,
  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 * coreg
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)
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,active_dims=[1])
coreg_2 = gpflow.kernels.Coregion(output_dim=output_dim,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",)

我收到错误“尺寸必须相等”,我似乎无法纠正此错误

我的问题是:

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

请注意:这是我在这里的第一个问题。我已尝试遵守准则,但请提示我的问题是否有任何更改,使其更适合/可回答。

解决方法

不幸的是,目前在 GPflow 中没有对 ChangePoint 内核的多输出支持。在您的情况下,这实质上意味着 ChangePoint 内核不知道要执行的输出维度,即使构成它的内核设置了 active_dims 参数。

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

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

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 源中找到 gpflow/kernels/changepoints.py 并手动实施您在 pull request 中找到的更改。

如果您决定这样做,请注意,此提议的更改尚未经过广泛测试,并且还不是 GPflow 支持的功能。


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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...