#python-2.7 #scipy #autograd
#python-2.7 #scipy #autograd
Вопрос:
Я пытаюсь выполнить задачу минимизации, используя scipy.optimize
, включая NonlinearConstraint
. Я действительно не хочу сам кодировать производные, поэтому я использую autograd
для этого. Но даже несмотря на то, что я следую точно такой же процедуре для аргументов minimize
и to NonlinearConstraint
, первое, похоже, работает, а второе — нет.
Вот мой MWE:
useconstraint = False
import autograd
import autograd.numpy as np
from scipy import optimize
def function(x): return x[0]**2 x[1]**2
functionjacobian = autograd.jacobian(function)
functionhvp = autograd.hessian_vector_product(function)
def constraint(x): return np.array([x[0]**2 - x[1]**2])
constraintjacobian = autograd.jacobian(constraint)
constrainthvp = autograd.hessian_vector_product(constraint)
constraint = optimize.NonlinearConstraint(constraint, 1, np.inf, constraintjacobian, constrainthvp)
startpoint = [1, 2]
bounds = optimize.Bounds([-np.inf, -np.inf], [np.inf, np.inf])
print optimize.minimize(
function,
startpoint,
method='trust-constr',
jac=functionjacobian,
hessp=functionhvp,
constraints=[constraint] if useconstraint else [],
bounds=bounds,
)
Когда я выключаю useconstraint
(вверху), он работает нормально и сводится к (0, 0)
минимуму, как и ожидалось. Когда я включаю его, я получаю следующую ошибку:
Traceback (most recent call last):
File "test.py", line 29, in <module>
bounds=bounds,
File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 613, in minimize
callback=callback, **options)
File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py", line 336, in _minimize_trustregion_constr
for c in constraints]
File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_constraints.py", line 213, in __init__
finite_diff_bounds, sparse_jacobian)
File "/home/heshy/.local/lib/python2.7/site-packages/scipy/optimize/_differentiable_functions.py", line 343, in __init__
self.H = hess(self.x, self.v)
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/wrap_util.py", line 20, in nary_f
return unary_operator(unary_f, x, *nary_op_args, **nary_op_kwargs)
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/differential_operators.py", line 24, in grad
vjp, ans = _make_vjp(fun, x)
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/core.py", line 10, in make_vjp
end_value, end_node = trace(start_node, fun, x)
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/tracer.py", line 10, in trace
end_box = fun(start_box)
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/wrap_util.py", line 15, in unary_f
return fun(*subargs, **kwargs)
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/differential_operators.py", line 88, in vector_dot_grad
return np.tensordot(fun_grad(*args, **kwargs), vector, np.ndim(vector))
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/tracer.py", line 44, in f_wrapped
ans = f_wrapped(*argvals, **kwargs)
File "/home/heshy/.local/lib/python2.7/site-packages/autograd/tracer.py", line 48, in f_wrapped
return f_raw(*args, **kwargs)
File "/home/heshy/.local/lib/python2.7/site-packages/numpy/core/numeric.py", line 1371, in tensordot
raise ValueError("shape-mismatch for sum")
ValueError: shape-mismatch for sum
Что я делаю не так? Я думаю, что проблема в hessian_vector_product
том, что я вижу hess
в сообщении об ошибке, но я не уверен в этом.
Ответ №1:
Хорошо, я нашел ответ. Это было очень запутанно.
hessp
Аргумент minimize
ожидает функцию, которая возвращает «гессиан целевой функции, умноженный на произвольный вектор p» (источник). В отличие от этого, hess
аргумент в NonlinearConstraint
ожидает «вызываемый объект, [который] должен возвращать матрицу мешанины dot(fun, v)» (источник).
Если вы интерпретируете первую цитату, как я, «Hessian of (целевая функция, умноженная на произвольный вектор p)», это означает практически то же самое, что «матрица мешанины dot (fun, v)». Поэтому я предположил, что вы могли бы использовать одну и ту же autograd
функцию для обоих.
Однако правильная интерпретация — «(гессиан целевой функции), умноженный на произвольный вектор p», что совершенно другое. hessian_vector_product
Функция в autograd
выдает правильный результат для первого, но для второго нужна другая функция.
Комментарии:
1. Итак, было ли решение для этого, или вы не можете использовать autograd таким образом?