В настоящее время я пытаюсь найти минимум некоторой функции f(arg1, arg2, arg3,...)
помощью оптимизации Гаусса с использованием модуля GPyOpt. В то время как 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, но не повезло).
Я бы проверил partial
функцию из стандартной библиотеки functools. Он позволяет частично указать функцию, например, например:
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})
Более подробную информацию можно найти в этом учебном пособии по контекстной оптимизации.
GPyOpt
(исправление аргументов кажется слишком важным, чтобы требовать внешнего модуля)discrete
в ваше пространство, например, так:{'name': 'y', 'type': 'discrete', 'domain': (2,)}