【问题标题】:Using python scipy.optimize.minimize with function that evaluates both value and gradient [duplicate]将python scipy.optimize.minimize与评估值和梯度的函数一起使用[重复]
【发布时间】:2021-05-19 05:14:29
【问题描述】:

我想使用 python 找到一个函数(几个变量)的局部最小值。 scipy.optimize.minimize 中描述的一组基于梯度的优化方法似乎是一个不错的起点。

我可以计算函数的值以及函数的梯度。事实上,当我评估函数时,我基本上是免费获得梯度的。 有没有办法利用这个属性来最小化使用 scipy.optimize.minimize 的函数调用次数?

我仅指使用基于梯度的优化的方法(例如 BFGS)。

更准确地说,如何将计算数学函数值及其梯度值的单个 python 函数插入到 scipy.optimize.minimize 中?

而不是这个:

res = minimize(fun, x0, method='BFGS', jac=grad_fun,options={'disp': True})

我想要这样的东西:

res = minimize(fun_and_grad, x0, method='BFGS', options={'disp': True})

谢谢!

【问题讨论】:

  • 对不起!我认为这是重复的! stackoverflow.com/questions/37734430/… 我不知道该怎么处理这个问题。
  • 副本是否回答了您的问题?然后它可以作为副本关闭。
  • 是的,虽然我的问题所吸引的答案也很相关和有趣,并且没有出现在上一个问题中。

标签: python scipy scipy-optimize


【解决方案1】:

您可以使用自定义类来缓存渐变,然后在请求时返回它:

class Wrapper:
    def __init__(self):
        self.cache = {}

    def __call__(self, x, *args):
        fun, grad = compute_something(x)
        self.cache['grad'] = grad
        return fun

    def jac(self, x, *args):
        return self.cache.pop('grad')


wrapper = Wrapper()
res = minimize(wrapper, x0, jac=wrapper.jac, method='BFGS', options={'disp': True})

【讨论】:

  • 是的,缓存绝对是聪明的。尽管在这种情况下,代码可能会崩溃,因为 minimum 中的许多算法不一定调用梯度并在相同的评估点上运行。
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2019-06-03
  • 2016-02-16
相关资源
最近更新 更多