scipy.optimize.fmin_bfgs单个函数计算f和fprime

use*_*890 5 python optimization gradient scipy

我正在使用scipy.optimize.fmin_bfgs(f, init_theta, fprime)最小化f,它具有渐变fprime.我计算ffprime在一个函数中,因为大多数计算是相同的,所以没有必要做两次.

有没有什么方法来调用fmin_bfgs()指定同时返回一个单一的功能ffprime

Dou*_*gal 4

如果您试图节省计算时间,而不是仅仅为了代码方便而将 和 的计算结合起来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)
Run Code Online (Sandbox Code Playgroud)

如果我们那么做

>>> 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.])
Run Code Online (Sandbox Code Playgroud)

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