优化.Scipy.l_bfgs_b:为什么它要多次计算相同的函数值?

2024-04-26 14:53:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用scipy.optimize公司找出试图拟合某些数据的模拟参数。A创建了一个函数,该函数在数据上给出模型的卡方,以便scipy.optimize公司将不得不最小化这个功能。在

我的一个主要问题是模拟,因此被调用的函数非常耗时,而且我发现方法L-BFGS_B(或者仅仅是BFGS)在完全相同的点上计算出函数值的几倍!!!我不明白它为什么会那样做,这让我很痛苦。在

一个非常简单的函数示例:

from scipy.optimize import minimize

def f3(x):
    print x
    return x[0]*x[0] + x[1]*x[1] + x[2]*x[2]

x0 = [3, -5, 7]

minimize(f3, x0, method = 'L-BFGS-B')

将返回:

^{pr2}$

从函数调用的打印列表中可以看到,minimize在同一x多次调用f3

这很令人沮丧,因为我觉得在这里浪费了很多时间。在

如果有人能在这里启发我,我很高兴。谢谢。在


Tags: 数据方法函数模型功能示例参数公司
2条回答

它在计算梯度的有限差分近似值。在

它会这么做是因为它没有像你希望的那样小心。此缺陷已添加到scipy bug跟踪器here。正如我在那里发布的,您可以通过自己缓存以前的值来解决这个问题。或者,您可以在您的minimize调用中使用jac=True,并编写函数来返回该点的值和渐变。第一种方法的一个例子是:

import numpy as np
from scipy import optimize

class CacheLast(object):
    def __init__(self, f):
        self.f = f
        self.last_x = None
        self.last_f = None
        self.ncall = 0

    def __call__(self, x):
        if np.all(x == self.last_x):
            return self.last_f
        else:
            self.last_x = x
            self.last_f = self.f(x)
            self.ncall += 1
            return self.last_f

def f3(x):
    return x[0]*x[0] + x[1]*x[1] + x[2]*x[2]

x0 = [3, -5, 7] 

func = CacheLast(f3)
res = optimize.minimize(func, x0, method='L-BFGS-B')

print 'total function calls: ', res.nfev
print 'actual function evals: ', func.ncall

它给出了:

^{pr2}$

相关问题 更多 >