我目前正在尝试通过高斯优化方法,使用GPyOpt模块来寻找函数f(arg1, arg2, arg3, ...)
的最小值。虽然f(...)
接受多个输入参数,但我只想优化其中的一个参数。该如何实现呢?
我目前的“解决方案”是将f(...)
放入一个虚拟类中,并在初始化时指定不需要优化的参数。虽然这可能是解决这个问题最符合Python风格的方法,但它也比实际需要的复杂得多。
对于函数f(x, y, method)
的一个简短工作示例,其中y
(一个数值)和method
(一个字符串)是固定的,而x
是需要优化的参数:
import GPyOptimport numpy as np# 虚拟类class TarFun(object): # 在初始化对象时固定y def __init__(self, y, method): self.y = y self.method = method # 实际要最小化的函数 def f(self, x): if self.method == 'sin': return np.sin(x-self.y) elif self.method == 'cos': return np.cos(x-self.y)# 创建TarFun对象,固定y为2并使用'sin'方法tarFunObj = TarFun(y=2, method='sin')# 描述x的属性space = [{'name':'x', 'type': 'continuous', 'domain': (-5,5)}]# 创建仅优化x的GPyOpt对象optObj = GPyOpt.methods.BayesianOptimization(tarFunObj.f, space)
肯定有更简单的方法。但我找到的所有示例都是优化所有参数的,我无法通过阅读GitHub上的代码找到答案(我以为会在GPyOpt.core.task.space中找到相关信息,但没有找到)。
回答:
GPyOpt原生支持这种方法,称为上下文。你可以描述函数的整个域,然后在调用优化例程时通过上下文字典固定某些变量的值。API看起来像这样:
myBopt.run_optimization(..., context={'var1': .3, 'var2': 0.4})
关于上下文优化的更多细节可以在此教程笔记本中找到。