如何在gpflow中固定内核长度尺度的某些维度?

2024-10-02 08:20:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个2d内核

k = gpflow.kernels.RBF(lengthscales=[24*5,1e-5])
m = gpflow.models.GPR(data=(X,Y), kernel=k, mean_function=None)

我想修正第二维度的长度比例,然后优化另一个维度

我可以使用

gpflow.set_trainable(m.kernel.lengthscales, False) 

但是我不能只给这个方法传递一个维度

在GPy中,我们将称之为m.kern.lengthscale[1:].fixed()或其他什么

也许我可以使用一个转换来大致实现这一点(例如here),但这相当复杂


Tags: nonedatamodelsfunctionmeankernel内核比例
1条回答
网友
1楼 · 发布于 2024-10-02 08:20:54

GPflow为每个参数使用一个tf.Variable,比如内核的lengthscales,而TensorFlow只允许您将变量的trainable状态作为一个整体进行更改。对于任意维度,每个维度都有一个单独的参数并不容易实现,但是您可以很容易地对所需内核进行子类化,并使用如下属性覆盖lengthscales

import gpflow
import tensorflow as tf

class MyKernel(gpflow.kernels.SquaredExponential):  # or whichever kernel you want
    @property
    def lengthscales(self) -> tf.Tensor:
        return tf.stack([self.lengthscale_0, self.lengthscale_1])

    @lengthscales.setter
    def lengthscales(self, value):
        self.lengthscale_0 = gpflow.Parameter(value[0], transform=gpflow.utilities.positive())
        self.lengthscale_1 = value[1]  # fixed

然后您可以简单地使用k = MyKernel(lengthscales=[24*5, 1e-5])。(虽然1e-5的长度刻度看起来不太合适!但这超出了这个问题的范围。)

这是因为超类的__init__(在gpflow.kernels.stational中)分配self.lengthscales = Parameter(lengthscales, transform=positive()),因此在这个自定义类中,它调用属性设置器,而属性设置器反过来创建两个单独的属性。属性getter然后将它们重新缝合在一起,用于实际需要二维向量的方法

相关问题 更多 >

    热门问题