gpt4 book ai didi

python - scipy.optimize.fmin_bfgs 单个函数同时计算 f 和 fprime

转载 作者:太空狗 更新时间:2023-10-30 01:09:43 26 4
gpt4 key购买 nike

我正在使用 scipy.optimize.fmin_bfgs(f, init_theta, fprime) 来最小化 f,它具有梯度 fprime。我在单个函数中计算 ffprime,因为大部分计算都是相同的,因此无需执行两次。

有没有什么方法可以调用 fmin_bfgs() 指定返回 ffprime 的单个函数?

最佳答案

如果您试图节省计算时间,而不是为了代码方便而将 ff' 的计算结合起来,那么您似乎需要一个额外的包装器围绕您的函数来缓存值,因为 fmin_bfgs 似乎不允许您传递这样的函数(与其他一些优化函数不同)。

这是一种方法,将 10 个最近评估的点保存在一个小缓存中。 (我不确定对此函数的调用是否需要线程安全:可能不需要,但如果是这样,我想您可能需要在此处添加一些锁定。)

def func_wrapper(f, cache_size=10):
evals = {}
last_points = collections.deque()

def get(pt, which):
s = pt.tostring() # get binary string of numpy array, to make it hashable
if s not in evals:
evals[s] = f(pt)
last_points.append(s)
if len(last_points) >= cache_size:
del evals[last_points.popleft()]
return evals[s][which]

return functools.partial(get, which=0), functools.partial(get, which=1)

如果我们这样做

>>> def f(x):
... print "evaluating", x
... return (x-3)**2, 2*(x-3)

>>> f_, fprime = func_wrapper(f)

>>> optimize.fmin_bfgs(f_, 1000, fprime)
evaluating [ 994.93480441]
evaluating [ 974.67402207]
evaluating [ 893.63089268]
evaluating [ 665.93446894]
evaluating [ 126.99931561]
evaluating [ 3.]
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 4
Function evaluations: 7
Gradient evaluations: 7
array([ 3.])

我们可以看到我们没有重复任何评估。

关于python - scipy.optimize.fmin_bfgs 单个函数同时计算 f 和 fprime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10712789/

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