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

Python 如何在gpflow中固定内核长度尺度的某些维度?,python,constraints,gaussian,gpflow,Python,Constraints,Gaussian,Gpflow,我有一个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.lengthsc

我有一个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()
或其他什么


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

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

导入gpflow
导入tensorflow作为tf
类MyKernel(gpflow.kernels.squaredeponential):#或任何您想要的内核
@财产
def长度标度(自)->tf.张量:
返回tf.stack([self.lengthscale\u 0,self.lengthscale\u 1])
@长度设定器
def长度刻度(自身、值):
self.lengthscale_0=gpflow.Parameter(值[0],transform=gpflow.utilities.positive())
self.lengthscale_1=值[1]#固定
然后您可以简单地使用
k=MyKernel(lengthscales=[24*5,1e-5])
。(虽然1e-5的长度刻度看起来不太合适!但这超出了这个问题的范围。)


这是因为超类的
\uuuu init\uuuu
(在gpflow.kernels.statistic中)分配
self.lengthscales=参数(lengthscales,transform=positive())
,因此在这个自定义类中,它会调用属性设置器,而属性设置器又会创建两个单独的属性。属性getter然后将它们重新缝合在一起,用于实际期望二维向量的方法。

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

导入gpflow
导入tensorflow作为tf
类MyKernel(gpflow.kernels.squaredeponential):#或任何您想要的内核
@财产
def长度标度(自)->tf.张量:
返回tf.stack([self.lengthscale\u 0,self.lengthscale\u 1])
@长度设定器
def长度刻度(自身、值):
self.lengthscale_0=gpflow.Parameter(值[0],transform=gpflow.utilities.positive())
self.lengthscale_1=值[1]#固定
然后您可以简单地使用
k=MyKernel(lengthscales=[24*5,1e-5])
。(虽然1e-5的长度刻度看起来不太合适!但这超出了这个问题的范围。)

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