python - 如何区分 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
围绕可调用函数创建一个包装器,即使这样也无济于事。非常感谢您的帮助!
解决方案
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.
推荐阅读
- jquery - 如何使用收据中的一些输入创建文档签名应用程序
- flutter - 使用 dio 获取文件时获取文件位置
- php - MySQL选择日期变量不起作用,硬编码字符串正在工作
- vue.js - 如何解决 joi regex 必须是 RegExp 错误
- javascript - 使用 useEffect 挂钩呈现内容的问题
- javascript - 当提取主体为缓冲区时,无法将对象放置在数字海洋空间上
- javascript - 在独立应用程序脚本中更改类的问题
- node.js - 如何使用 ldapjs 在活动目录中设置帐户选项?
- amazon-web-services - 如何使用 Hibernate 通过 IAM 身份验证连接到 RDS
- apache-nifi - 在 Nifi 中生成动态 URL 的最佳方法