Python / GPyOpt: оптимизация только одного аргумента

1

В настоящее время я пытаюсь найти минимум некоторой функции 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, но не повезло).

Теги:
optimization
machine-learning
gaussian
hyperparameters

2 ответа

1

Я бы проверил 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
)
  • 0
    Определенно более обходной путь, чем то, что я делал, но я все еще думаю, что должен быть способ напрямую указать это в объекте GPyOpt (исправление аргументов кажется слишком важным, чтобы требовать внешнего модуля)
  • 0
    Вы также можете просто добавить переменную типа discrete в ваше пространство, например, так: {'name': 'y', 'type': 'discrete', 'domain': (2,)}
Показать ещё 1 комментарий
0

GPyOpt поддерживает это изначально с контекстом. Вы описываете весь домен вашей функции, а затем фиксируете значения некоторых переменных с помощью контекстного словаря при вызове подпрограммы оптимизации. API выглядит так:

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

Более подробную информацию можно найти в этом учебном пособии по контекстной оптимизации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню