【问题标题】:Kernel's hyper-parameters; initialization and setting bounds内核的超参数;初始化和设置边界
【发布时间】:2019-04-03 02:35:41
【问题描述】:

我想许多像我一样的人可能会对如何使用 GPFlow 来解决他们的特殊问题感兴趣。关键是如何定制 GPFlow,一个很好的例子会很有帮助。

就我而言,我阅读并尝试了很多 cmets 提出的问题,但没有任何真正的成功。设置内核模型参数并不简单(使用默认值创建,然后通过删除对象方法进行)。变换方法模糊。

如果您可以添加一个示例显示,那将非常有帮助。如何初始化和设置各向异性内核模型的边界(长度尺度值和边界、方差等)并特别添加观察误差(作为类似数组的 alpha 参数)

【问题讨论】:

  • 您能否澄清“设置内核模型参数并不简单”的意思(例如,kern = gpflow.kernels.Matern52(input_dim=1, lengthscales=0.3) 和后来的kern.lengthscales = 5.0)? “删除对象方法”是什么意思? “转换方法”是什么意思? “添加观察误差”是什么意思 - 不同数据点的不同噪声?
  • 与 sklearn.GP 相比并不简单:kern = rbf(length_scale=[a,b,c], length_scale_bounds=([a1,a2],[b1,b2],[c1,c2]) ConstantKernel(sill, tuple(sill_bound) 观察错误;在拟合期间添加到核矩阵对角线的值。较大的值对应于观察中增加的噪声水平。

标签: process gaussian gpflow


【解决方案1】:

如果你只想设置一个值,那么你可以这样做

model = gpflow.models.GPR(np.zeros((1, 1)),
                          np.zeros((1, 1)),
                          gpflow.kernels.RBF(1, lengthscales=0.2))

或者

model = gpflow.models.GPR(np.zeros((1, 1)),
                          np.zeros((1, 1)),
                          gpflow.kernels.RBF(1))
model.kern.lengthscales = 0.2

如果你想改变变换,你要么需要子类化内核,要么你也可以这样做

with gpflow.defer_build():
     model = gpflow.models.GPR(np.zeros((1, 1)),
                               np.zeros((1, 1)),
                               gpflow.kernels.RBF(1))
     transform = gpflow.transforms.Logistic(0.1, 1.))
     model.kern.lengthscales = gpflow.params.Parameter(0.3, transform=transform)
model.compile()

您需要 defer_build 在更改转换之前停止正在编译的图形。使用上述方法,张量流图的编译被延迟(直到明确的model.compile()),因此使用预期的边界变换构建。

对似然方差使用数组参数超出了 gpflow 的范围。对于它的价值(并且因为它之前已被问过),该特定模型尤其成问题,因为尚不清楚如何定义测试点。

【讨论】:

    【解决方案2】:

    可以使用.assign() 函数或通过直接赋值来设置内核参数。请参阅笔记本https://github.com/GPflow/GPflow/blob/develop/doc/source/notebooks/understanding/tf_graphs_and_sessions.ipynb。您无需删除参数即可为其分配新值。

    如果您想获得每个数据点的噪声,则需要实现自己的自定义似然性,您可以以 likelihoods.py 中的 Gaussian似然性为例。

    如果“边界”是指限制参数的优化范围,则可以使用Logistic 转换。如果要为参数传递自定义转换,可以将构造的 Parameter 对象传递给具有自定义转换的构造函数。或者,您可以为模型分配一个新创建的 Parameter,并对其进行新的转换。

    【讨论】:

      【解决方案3】:

      以下是有关如何访问和更改 GPflow 参数的更多信息:viewing, getting and settings parameters documentation

      @user1018464 关于在现有参数中替换转换的答案的额外位:更改转换有点棘手,一旦在 TensorFlow 中编译模型,您就无法更改转换。

      例如

      likelihood = gpflow.likelihoods.Gaussian()
      likelihood.variance.transform = gpflow.transforms.Logistic(1., 10.)
      ----
      GPflowError: Parameter "Gaussian/variance" has already been compiled.
      

      相反,您必须重置 GPflow 对象:

      likelihood = gpflow.likelihoods.Gaussian()  # All tensors compiled
      
      likelihood.clear()
      likelihood.variance.transform = gpflow.transforms.Logistic(2, 5)
      likelihood.variance = 2.5
      likelihood.compile()
      

      【讨论】:

        猜你喜欢
        • 2014-12-09
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多