我目前正在尝试使用GPyOpt模块通过高斯优化找到一些函数f(arg1, arg2, arg3, ...)的最小值。虽然f(...)接受许多输入参数,但我只想优化其中的一个。你怎么做到的?
我目前的“解决方案”是将f(...)放在一个虚拟类中,并在初始化它时指定不需要优化的参数。虽然这可以说是解决这个问题的最pythonesque式的方法,但它也比它应有的复杂得多。
优化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中找到信息,但没有运气)。
发布于 2018-12-18 00:29:18
GPyOpt通过上下文原生地支持这一点。你描述你的函数的整个领域,然后在调用优化例程时用上下文字典固定一些变量的值。API看起来像这样:
myBopt.run_optimization(..., context={'var1': .3, 'var2': 0.4})有关上下文优化的更多详细信息,请参阅此tutorial notebook。
发布于 2018-08-09 05:41:59
我会从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
)https://stackoverflow.com/questions/51596088
复制相似问题