GPflow 多输出变化点
GPflow multi-output change-point
我想构建一个多输出GP,输出之间的相关结构包含一个变化点。更改应该 仅 发生在 Coregion 内核的相关结构中,而内核本身(即长度尺度和内核系列)在更改前后应该保持不变。
下面,我包含示例(来自 GPflow 文档 [1., 2.] 和我自己的 [3.]),其中:
- 输出之间有相关结构,但没有变化点,
- 演示如何在 GPflow 中构建变点,
- 我对包含变化点的输出之间的相关结构的尝试。
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, 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",
)
我收到错误“尺寸必须相等”,我似乎无能为力。
我的问题是:
- 我怎样才能让这个模型完全适合?
- 在当前状态下,我认为此设置适合变化点前后的不同长度尺度,而我只希望输出中的相关结构发生变化。如何将长度尺度设置为相同的单个可训练参数?
请注意:这是我的第一个问题。我已尝试遵守指南,但请提示我的问题是否有更改,这会使它变得更 suitable/answerable.
遗憾的是,当前 GPflow 中没有对 ChangePoint 内核的 MultiOutput 支持。在您的情况下,这实质上意味着 ChangePoint 内核不知道要执行输出的哪个维度,即使构成它的内核设置了 active_dims
参数。
我有一个 Pull Request 正在执行以实现此功能,您可以在此处找到: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_1
使用相同的 k_base
实例和 k_2
。这意味着您已经在 CP 的两侧安装了相同的长度尺度,这似乎是您正在寻找的设置。
我想构建一个多输出GP,输出之间的相关结构包含一个变化点。更改应该 仅 发生在 Coregion 内核的相关结构中,而内核本身(即长度尺度和内核系列)在更改前后应该保持不变。
下面,我包含示例(来自 GPflow 文档 [1., 2.] 和我自己的 [3.]),其中:
- 输出之间有相关结构,但没有变化点,
- 演示如何在 GPflow 中构建变点,
- 我对包含变化点的输出之间的相关结构的尝试。
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, 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",
)
我收到错误“尺寸必须相等”,我似乎无能为力。
我的问题是:
- 我怎样才能让这个模型完全适合?
- 在当前状态下,我认为此设置适合变化点前后的不同长度尺度,而我只希望输出中的相关结构发生变化。如何将长度尺度设置为相同的单个可训练参数?
请注意:这是我的第一个问题。我已尝试遵守指南,但请提示我的问题是否有更改,这会使它变得更 suitable/answerable.
遗憾的是,当前 GPflow 中没有对 ChangePoint 内核的 MultiOutput 支持。在您的情况下,这实质上意味着 ChangePoint 内核不知道要执行输出的哪个维度,即使构成它的内核设置了 active_dims
参数。
我有一个 Pull Request 正在执行以实现此功能,您可以在此处找到: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_1
使用相同的 k_base
实例和 k_2
。这意味着您已经在 CP 的两侧安装了相同的长度尺度,这似乎是您正在寻找的设置。