gpt4 book ai didi

python - 如何返回成本,grad 作为 scipy 的 fmin_cg 函数的元组

转载 作者:太空狗 更新时间:2023-10-29 21:46:49 26 4
gpt4 key购买 nike

我怎样才能让 scipy 的 fmin_cg 使用一个返回 costgradient 作为元组的函数?使用 f 成本和 fprime 梯度的问题是,我可能必须执行两次操作(非常昂贵),通过该操作 gradcost 被计算。此外,在它们之间共享变量可能会很麻烦。

然而,在 Matlab 中,fmin_cg 使用一个函数,该函数将成本和梯度作为元组返回。我不明白为什么 scipy 的 fmin_cg 不能提供这样的便利。

提前致谢...

最佳答案

您可以使用 scipy.optimize.minimize使用 jac=True。如果出于某种原因这不是一个选项,那么您可以查看 how it handles this situation :

class MemoizeJac(object):
""" Decorator that caches the value gradient of function each time it
is called. """
def __init__(self, fun):
self.fun = fun
self.jac = None
self.x = None

def __call__(self, x, *args):
self.x = numpy.asarray(x).copy()
fg = self.fun(x, *args)
self.jac = fg[1]
return fg[0]

def derivative(self, x, *args):
if self.jac is not None and numpy.alltrue(x == self.x):
return self.jac
else:
self(x, *args)
return self.jac

这个类包装了一个返回函数值和梯度的函数,保留一个单元素缓存并检查它是否已经知道它的结果。用法:

fmemo = MemoizeJac(f, fprime)
xopt = fmin_cg(fmemo, x0, fmemo.derivative)

这段代码的奇怪之处在于它假定 f 总是在 fprime 之前被调用(但不是每个 f 调用之后都跟一个fprime 调用)。我不确定 scipy.optimize 是否真的保证了这一点,但是可以很容易地调整代码以不做出这种假设。上面的健壮版本(未测试):

class MemoizeJac(object):
def __init__(self, fun):
self.fun = fun
self.value, self.jac = None, None
self.x = None

def _compute(self, x, *args):
self.x = numpy.asarray(x).copy()
self.value, self.jac = self.fun(x, *args)

def __call__(self, x, *args):
if self.value is not None and numpy.alltrue(x == self.x):
return self.value
else:
self._compute(x, *args)
return self.value

def derivative(self, x, *args):
if self.jac is not None and numpy.alltrue(x == self.x):
return self.jac
else:
self._compute(x, *args)
return self.jac

关于python - 如何返回成本,grad 作为 scipy 的 fmin_cg 函数的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17431070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com