我有四个输入变量的函数,我试图使用 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
围绕可调用函数创建一个包装器,即使这样也无济于事。非常感谢您的帮助!