Python / GPyOpt:只优化一个参数
Python / GPyOpt: Optimizing only one argument
我目前正在尝试使用 GPyOpt 模块通过高斯优化找到某些函数 f(arg1, arg2, arg3, ...)
的最小值。虽然 f(...)
需要很多输入参数,但我只想优化其中的一个。你是怎么做到的?
我目前的"solution"是把f(...)
放在一个虚拟的class中,并在初始化时指定不优化的参数。虽然这可以说是解决这个问题的最符合 Python 风格的方法,但它也比它应有的复杂得多。
在优化 x
:
时固定 y
(数字)和 method
(字符串)的函数 f(x, y, method)
的简短工作示例
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 中找到信息,但没有运气)。
我会检查 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
)
GPyOpt 原生支持上下文。您描述函数的整个域,然后在调用优化例程时使用上下文字典修复某些变量的值。 API 看起来像这样:
myBopt.run_optimization(..., context={'var1': .3, 'var2': 0.4})
可以在此 tutorial notebook 中找到有关上下文优化的更多详细信息。
我目前正在尝试使用 GPyOpt 模块通过高斯优化找到某些函数 f(arg1, arg2, arg3, ...)
的最小值。虽然 f(...)
需要很多输入参数,但我只想优化其中的一个。你是怎么做到的?
我目前的"solution"是把f(...)
放在一个虚拟的class中,并在初始化时指定不优化的参数。虽然这可以说是解决这个问题的最符合 Python 风格的方法,但它也比它应有的复杂得多。
在优化 x
:
y
(数字)和 method
(字符串)的函数 f(x, y, method)
的简短工作示例
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 中找到信息,但没有运气)。
我会检查 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
)
GPyOpt 原生支持上下文。您描述函数的整个域,然后在调用优化例程时使用上下文字典修复某些变量的值。 API 看起来像这样:
myBopt.run_optimization(..., context={'var1': .3, 'var2': 0.4})
可以在此 tutorial notebook 中找到有关上下文优化的更多详细信息。