1

我目前正在尝试使用GPyOpt模块f(arg1, arg2, arg3, ...)通过高斯优化找到某些函数的最小值。虽然需要许多输入参数,但我只想优化其中一个。你是怎样做的?f(...)

我目前的“解决方案”是放入f(...)一个虚拟类并在初始化时指定不优化的参数。虽然这可以说是解决这个问题的最蟒蛇式的方法,但它也比它有任何权利要复杂得多。

f(x, y, method)优化时具有固定y(数字)和method(字符串)的函数的简短工作示例x

import GPyOpt
import numpy as np

# dummy class
class TarFun(object):
    # fix y while initializing the object
    def __init__(self, y, method):
        self.y = y
        self.method = method
    # actual function to be minimized
    def f(self, x):
        if self.method == 'sin':
            return np.sin(x-self.y)
        elif self.method == 'cos':
            return np.cos(x-self.y)

# create TarFun object with y fixed to 2 and use 'sin' method
tarFunObj = TarFun(y=2, method='sin')
# describe properties of x
space = [{'name':'x', 'type': 'continuous', 'domain': (-5,5)}]
# create GPyOpt object that will only optimize x
optObj = GPyOpt.methods.BayesianOptimization(tarFunObj.f, space)

肯定有一个更简单的方法。但是我发现的所有示例都优化了所有参数,我无法通过阅读 github 上的代码来弄清楚(虽然我会在GPyOpt.core.task.space中找到信息,但没有运气)。

4

2 回答 2

1

我会检查functools标准库中的partial函数。它允许您部分指定一个函数,例如:

import GPyOpt
import numpy as np
from functools import partial


def f(x, y=0):
    return np.sin(x - y)


objective = partial(f, y=2)
space = [{'name': 'x', 'type': 'continuous', 'domain': (-5, 5)}]

opt = GPyOpt.methods.BayesianOptimization(
    objective, domain=space
)
于 2018-08-08T21:41:58.580 回答
1

GPyOpt 通过上下文原生支持这一点。您描述函数的整个域,然后在调用优化例程时使用上下文字典修复一些变量的值。API 看起来像这样:

myBopt.run_optimization(..., context={'var1': .3, 'var2': 0.4})

可以在本教程笔记本中找到有关上下文优化的更多详细信息。

于 2018-12-17T16:29:17.823 回答