Как заставить функции модуля оптимизации scipy одновременно принимать функцию и ее градиент - PullRequest
2 голосов
/ 08 ноября 2011

У меня довольно сложная функция f (x), которую я хочу оптимизировать, и я использую функцию fmin_bfgs из модуля scipy.optimize от Scipy. Это заставляет меня дать функцию минимизации и функцию градиента f '(x) отдельно, что очень жаль, потому что некоторые вычисления для градиента могут быть выполнены при оценке функции f (x).

Есть ли способ объединить обе функции? Я думал о сохранении промежуточных значений, необходимых для обеих функций, но я не знаю, гарантирует ли функция fmin_bfgs, что f (x) вычисляется раньше, чем f '(x).

Спасибо

Ответы [ 2 ]

4 голосов
/ 12 апреля 2013

Методы scipy.optimize.minimize имеют параметр, называемый "jac".Если установлено значение True, минимизация будет ожидать, что вызываемая функция f (x) возвратит значение функции и ее производные.

1 голос
/ 08 ноября 2011

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


cache={}
def expensive_calc(x):
    # If x is a numpy array, you need to convert x into something hashable so it
    # can be used as a key in cache.
    key=tuple(x)
    try:
        return cache[key]
    except KeyError:
        # do expensive calc for result
        cache[key] = result
        return result

def func(x):
    y=expensive_calc(x)
    return something_based_on_y

def func_der(x):
    y=expensive_calc(x)
    return something_else_based_on_y

def optimize_fmin_bfgs():
    xopt = fmin_bfgs(func, x_guess, fprime=func_der)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...