我正在尝试用Python加速求解一个非线性最小二乘问题。我可以通过一个正向通道(val, jac) = fun
计算函数值和雅可比行列式。像scipy.optimize.least_squares
这样的求解器只接受两个单独的函数fun
和jac
,这对于我的问题来说意味着每次迭代必须计算两次函数值(一次在fun
中,一次在jac
中)。
有没有一个技巧,可以避免两次解决原始问题?
更通用的函数scipy.optimize.minimize
支持上面的风格,带有jac=True
关键字,但是对于我的问题来说,它很慢。
3条答案
按热度按时间8yparm6h1#
我认为最好的方法是使用MemoizeJac装饰器。这正是
scipy.optimize.minimize
在jac=True
的引擎盖下所做的:sycxhyv72#
你可以做一点黑客:
mm5n2pyu3#
从
scipy.optimize.minimize
的文档中:如果jac是布尔值且为True,则假定fun返回包含目标函数和梯度的元组(f,g)。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html?highlight=minimize
因此,您可以简单地这样做:
编辑,重新阅读您的问题,似乎此选项也适用于
least_squares
,但未记录。这也是可行的: