2016-12-13 3 views
0

Я пытаюсь решить для функции, используя специально метод dogleg в scipy.optimize.minimize. Для того, чтобы лучше понять его я адаптируя пример в нижней части страницы справки и с помощью метода резкого искривления:Есть ли ошибка в scipy-0.18.1 `scipy.optimize.minimize`?

from scipy.optimize import minimize 

def fun(x): 
    return (x[0] - 1)**2 + (x[1] - 2.5)**2 

# solver 
res = minimize(fun, (2, 0), method='dogleg', jac=False) # or jac=None, it doesn't matter 

print(res) 

Я получаю сообщение об ошибке ValueError: Jacobian is required for dogleg minimization.

Это похоже на старую проблему: "Jacobian is required for Newton-CG method" when doing a approximation to a Jacobian not being used when jac=False? который Безразлично» t, по-видимому, разрешены.

Итак, мой вопрос: есть ли в этом ошибка в этом minimize или я не использую его правильно?

+0

Обратите внимание, что Scipy и Python - это два полностью отдельных проекта с различными циклами выпуска и номерами версий. Название вопроса предполагает, что вы считаете, что SciPy является частью Python 3.5, чего, безусловно, нет. Каждый выпуск Scipy может использоваться вместе с несколькими версиями Python, а номер версии Scipy будет гораздо более релевантным для вашего вопроса, чем номер версии Python. –

ответ

2

Вы должны передать функцию якобиана для использования метода dogleg, поскольку это метод оптимизации на основе градиента. Если вы посмотрите на jac аргумент scipy.optimize.minimize он говорит

jac: BOOL или отозваны, опционально
якобиан (градиент) целевой функции. Только для CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg. Если jac является булевым и считается True, предполагается, что fun возвращает градиент вместе с целевой функцией. Если False, то градиент будет оцениваться численно. jac также может быть вызванным возвратом градиента цели. В этом случае он должен принимать те же аргументы, что и fun.

Затем, если вы посмотрите на Notes в нижней части страницы:

Метод использует резкое искривление резкое искривление доверительной область алгоритм безусловной минимизации. Этот алгоритм требует градиента и Hessian; кроме того, гессиан должен быть положительно определенным.

Некоторые методы на основе градиента не требуют явного якобиана (и/или гессиана), поскольку они будут использовать метод дифференцирования для их приближения. Однако doglegделает вам нужно явно передать такую ​​функцию.

+0

Я согласен, что это функция, которая не реализована, а не ошибка. Тем не менее, мое чтение документации состоит в том, что якобиан будет численно аппроксимирован, если он не указан явно. Вполне возможно использовать оптимизатор доверия на собачьей ноге с помощью численного аппроксимационного гессиана. –

+0

@SvenMarnach Это тоже моя интерпретация. Но что, если у меня нет якобиана/гессиана? Могу ли я использовать say_fprime (https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.approx_fprime.html#scipy.optimize.approx_fprime) для вычисления якобиана и просто проанализировать этот результат в 'jac'? Или мне нужно что-то интересное? –

+1

@MedullaOblongata Как насчет просто попробовать? Для примера, который вы предоставили, он определенно будет работать, но в реальных приложениях он может зависеть от особенностей функции, которую вы пытаетесь оптимизировать. –

Смежные вопросы