为什么HMC采样器为需要为正值的超参数返回负值?[1.0之前较旧的GPflow版本]

为什么HMC采样器为需要为正值的超参数返回负值?[1.0之前较旧的GPflow版本],gpflow,Gpflow,我想建立一个具有边缘化超参数的GP 我已经看到,使用gpflow中提供的HMC采样器,这是可能的 然而,当我尝试运行以下代码作为本说明的第一步时,这是在gpflow 0.5(一个较旧的版本)上,返回的样本是负数,即使长度刻度和方差需要为正数负数也没有意义 import numpy as np from matplotlib import pyplot as plt import gpflow from gpflow import hmc X = np.linspace(-3, 3, 20) Y

我想建立一个具有边缘化超参数的GP

我已经看到,使用gpflow中提供的HMC采样器,这是可能的

然而,当我尝试运行以下代码作为本说明的第一步时,这是在gpflow 0.5(一个较旧的版本)上,返回的样本是负数,即使长度刻度和方差需要为正数负数也没有意义

import numpy as np
from matplotlib import pyplot as plt
import gpflow
from gpflow import hmc

X = np.linspace(-3, 3, 20)
Y = np.random.exponential(np.sin(X) ** 2)
Y = (Y - np.mean(Y)) / np.std(Y)

k = gpflow.kernels.Matern32(1, lengthscales=.2, ARD=False)
m = gpflow.gpr.GPR(X[:, None], Y[:, None], k)
m.kern.lengthscales.prior = gpflow.priors.Gamma(1., 1.)
m.kern.variance.prior = gpflow.priors.Gamma(1., 1.)

# dont want likelihood be a hyperparam now so fixed
m.likelihood.variance = 1e-6
m.likelihood.variance.fixed = True

m.optimize(maxiter=1000)

samples = m.sample(500)
print(samples)
输出:

[[-0.43764571 -0.22753325]
 [-0.50418501 -0.11070128]
 [-0.5932655   0.00821438]
 [-0.70217714  0.05077999]
 [-0.77745654  0.09362291]
 [-0.79404456  0.13649446]
 [-0.83989415  0.27118385]
 [-0.90355789  0.29589641]
...
我不太了解HMC采样的细节,但我希望采样的后验超参数是正的,我检查了代码,它似乎可能与Log1pe变换有关,尽管我自己没有弄清楚。
这方面有什么提示吗?

如果您指定使用的是哪个GPflow版本,这会很有帮助,特别是从您发布的输出来看,您使用的是一个非常旧的GPflow 1.0之前的版本,而这实际上是自那以后得到改进的。在旧的GPflow中,这里发生的是sample方法返回单个数组sxp,其中S是采样数,P是自由参数数[例如,对于具有下三角变换的M x M矩阵参数,如近似后验方差q_sqrt的Cholesky,实际仅存储和优化M*M-1/2参数!]。这些是无约束空间中的值,也就是说,它们可以取任何值。转换请参见gpflow.Transforms模块提供加/减无穷大与约束值之间的映射,例如gpflow.Transforms.positive表示长度比例和方差。在旧的gpflow中,模型提供了一种获取样本的方法at获取sample返回的S x P数组,并返回一个pandas数据帧,其中包含您想要的所有可训练参数的列。或者,理想情况下,您可以使用最新版本的GPflow,其中HMC采样器直接返回数据帧!

非常感谢您提供的详细答案,使用get_sample_df解决了这个问题。