首页 > 解决方案 > 如何区分 minimum_squares() 函数中的关键字参数?

问题描述

我有四个输入变量的函数,我试图使用 Levenburg-Marquardt 优化方法最小化。先前使用前向差分近似计算 Hessian/Gradient 的结果不够准确,因此我想将 Hessian/Gradient 作为可调用参数添加到 least_squares() 方法。这是我尝试过的——

使用 Sympy,我计算了梯度和 Hessian 使用

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是梯度和 hessian 函数的附加参数。在我的leastsq函数调用中(我的目标函数只有一个输入),

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'参数的函数,当我将 Hessian 作为传递时,

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

我仍然得到同样的错误。我如何将参数传递*args给 Gradient/Hessian 可调用对象?我尝试使用functools.partial围绕可调用函数创建一个包装器,即使这样也无济于事。非常感谢您的帮助!

标签: pythonnumpyscipyargsscipy-optimize

解决方案


I don't think you can have different arguments for the function and its derivatives.

One way around could be to store that extra argument as an attribute (python functions can have attributes, too). Or create a class with a single-argument method and store that extra attribute on the instance.


推荐阅读