我想用边缘化的超参数构建一个 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 变换有关,尽管我自己没有弄清楚。
对此有任何提示吗?