如何在minimum_squares()函数中区分关键字args?

时间:2019-05-07 05:06:27

标签: python numpy scipy args scipy-optimize

我具有四个输入变量的功能,我正在尝试使用Levenburg-Marquardt优化方法将其最小化。以前使用正向差近似法计算Hessian / Gradient的结果不够准确,因此,我想将Hessian / Gradient作为可调用参数添加到minimum_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围绕可调用函数创建包装器,即使那样也无济于事。 非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为您不能对该函数及其派生函数使用不同的参数。

一种解决方法是将多余的参数存储为属性(python函数也可以具有属性)。或使用单参数方法创建一个类,并将该额外属性存储在实例上。