Как различить аргументы ключевых слов в функцииimum_squares ()? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть функция четырех входных переменных, которые я пытаюсь минимизировать, используя метод оптимизации Левенбурга-Марквардта. Предыдущие результаты, в которых гессиан / градиент вычислялся с использованием приближенной разностной аппроксимации, были недостаточно точными, поэтому я хотел добавить гессиан / градиент в качестве вызываемого аргумента к методу метода less_squares (). Это то, что я пробовал -

Используя Sympy, я вычислил градиент и гессиан, используя

gradient_vec = [diff(obj_func, var) for var in (x1, x2, y1, y2)]
hessian_mat = [[obj_func.diff(var1).diff(var2) for var1 in list((x1, x2, y1, y2))] for var2 in list((x1, x2, y1, y2))]
grad_func = lambdify([x1, x2, y1, y2, f], gradient_vec, 'numpy')
hess_matr_func = lambdify([x1, x2, y1, y2, f], hessian_mat, 'numpy')

где f - дополнительный аргумент для функций градиента и гессиана. В моем вызове функции leastsq (моя целевая функция имеет только один вход), * ​​1008 *

result = leastsq(obj_fun, x0=np.random.uniform(size=(4,)), Dfun=grad_func, args=(f,))

Я запускаю и получаю эту ошибку

TypeError: obj_fun() takes 1 positional argument but 2 were given

Итак, я попробовал функцию least_squares() с аргументом method='lm', и когда я передаю гессиан как,

result = least_squares(obj_fun, x0=np.random.uniform(size=(4,), method='lm', jac=hess_matr_func, args=(f,))

И я все еще получаю ту же ошибку. Как передать аргумент *args, но только градиенту / гессиану? Я попытался использовать functools.partial, чтобы создать оболочку для вызываемой функции, и даже это не помогло. Большое спасибо за вашу помощь!

1 Ответ

0 голосов
/ 10 мая 2019

Не думаю, что у вас могут быть разные аргументы для функции и ее производных.

Одним из способов может быть сохранение этого дополнительного аргумента в качестве атрибута (функции python также могут иметь атрибуты). Или создайте класс с методом с одним аргументом и сохраните этот дополнительный атрибут в экземпляре.

...