如何在GPFlow中固定二维核长度尺度的单个维度并优化其余维度?
如何在GPFlow中固定RBF核的单个长度尺度维度
我刚好碰到过类似的需求,给你两种简单可行的方案,不用复杂的变换就能搞定~
方案一:直接设置参数的可训练掩码
GPFlow的Parameter对象支持通过trainable_mask来指定哪些维度可以被优化。你可以在定义完模型后,直接给lengthscales参数设置掩码,让第一个维度可训练、第二个维度固定:
# 你的原始代码 k = gpflow.kernels.RBF(lengthscales=[24*5,1e-5]) m = gpflow.models.GPR(data=(X,Y), kernel=k, mean_function=None) # 设置可训练掩码:第一个维度允许优化,第二个维度固定 m.kernel.lengthscales.trainable_mask = [True, False]
这样在后续调用优化器(比如gpflow.optimizers.Scipy().minimize(m.training_loss, m.trainable_variables))的时候,只有第一个长度尺度会被更新,第二个维度的数值会保持你初始设置的1e-5不变。
方案二:拆分核为多个一维核的乘积
如果你习惯了GPy里分维度控制的方式,可以把多维RBF核拆成多个一维RBF核的乘积,这样每个维度的长度尺度是独立的参数,能更直观地控制是否训练:
# 分别定义两个一维RBF核,指定各自作用的维度 kernel_dim0 = gpflow.kernels.RBF(lengthscales=24*5, active_dims=[0]) # 作用于第0维度 kernel_dim1 = gpflow.kernels.RBF(lengthscales=1e-5, active_dims=[1]) # 作用于第1维度 # 组合成乘积核,效果和多维RBF核一致 k = kernel_dim0 * kernel_dim1 # 固定第二个维度的长度尺度 gpflow.set_trainable(kernel_dim1.lengthscales, False) # 构建GPR模型 m = gpflow.models.GPR(data=(X,Y), kernel=k, mean_function=None)
这种方式的好处是结构清晰,后续如果需要调整其他维度的训练状态,直接对对应的一维核操作就行,非常灵活。
两种方案都能达到你想要的效果,看你更喜欢哪种风格啦~
内容的提问来源于stack exchange,提问作者lionfish
相关产品推荐
相关产品推荐

