在GPflow 2.0中进行GP回归时,我想在长度比例上设置硬边界(即限制长度比例优化范围)。在该线程(Setting hyperparameter optimization bounds in GPflow 2.0之后,我构造了一个TensorFlow Bijector链(请参见下面的using namespace boost::math;
students_t distt(df);
// implementation of M +- t(df, 1 - alpha)*standadrd_deviation/sqrt(n)
// with t(df, alpha) being the quantile of a student_t distribution with df degress of freedom and significance alpha
double quantile_ = quantile(complement(distt, this->alpha/2));
double W = quantile_ * std_M ; // std_M is the standard deviation divided by sqrt(num of elements)
double CI_MUpper = mesor + W;
double CI_MLower = mesor - W;
函数)。但是,下面的双射链不会阻止模型在假定范围之外进行优化。我需要更改什么以使cart, cart_response = Cart.objects.get_or_create(owner=owner, is_ordered=False, ref_code=ref_code)
OrderItem.create(cart=cart, item_count=item_count, price=total_price, color=color, size=size, product=product)
函数对优化施加严格的限制?
下面是MRE:
bounded_lengthscale
谢谢!
答案 0 :(得分:1)
在MWE中,您将assign
新的值设置为已存在的Parameter
(并且没有逻辑转换)。该值是使用逻辑转换构造的Parameter具有的约束空间值,但是该转换不会被继承。取而代之的是,您需要替换而不进行逻辑转换的参数,而将其替换为您想要的转换:m.kernel.lengthscale = bounded_lengthscale(0,1,0.5)
。
请注意,您分配给kernel.lengthscale
属性的对象必须是一个Parameter
实例;如果您像MWE中那样分配tf.cast(parameter)
的返回值,则它等效于一个常量,并且实际上不会对其进行优化!
由于float32 / float64不匹配,在此问题中仅移动MWE中的tf.cast不会立即起作用。要解决此问题,AffineScalar双射器必须位于float64中;它没有dtype
参数,而是将参数分别转换为shift=
和scale=
到所需的类型:
def bounded_lengthscale(low, high, lengthscale):
"""Make lengthscale tfp Parameter with optimization bounds."""
affine = tfb.AffineScalar(shift=tf.cast(low, tf.float64),
scale=tf.cast(high-low, tf.float64))
sigmoid = tfb.Sigmoid()
logistic = tfb.Chain([affine, sigmoid])
parameter = gpflow.Parameter(lengthscale, transform=logistic, dtype=tf.float64)
return parameter
m.kernel.lengthscale = bounded_lengthscale(0, 1, 0.5)
(GPflow可能应该包含这样的帮助器函数,以使有界参数转换更易于使用-GPflow总是感谢人们的帮助,因此,如果要将其转换为请求请求,请这样做!)
答案 1 :(得分:0)
tfb.Sigmoid
现在接受 low
和 high
参数,正如@Brian Patton 在评论中预测的那样。
因此,代码可以简化为:
from tensorflow_probability import bijectors as tfb
def bounded_lengthscale(low, high, lengthscale):
"""Make lengthscale tfp Parameter with optimization bounds."""
sigmoid = tfb.Sigmoid(low, high)
parameter = gpflow.Parameter(lengthscale, transform=sigmoid, dtype='float32')
return parameter
m.kernel.lengthscale = bounded_lengthscale(0, 1, 0.5)