scipy.optimize.

fmin_l_bfgs_b#

scipy.optimize.fmin_l_bfgs_b(func, x0, fprime=None, args=(), approx_grad=0, bounds=None, m=10, factr=10000000.0, pgtol=1e-05, epsilon=1e-08, iprint=<object object>, maxfun=15000, maxiter=15000, disp=<object object>, callback=None, maxls=20)[source]#

使用 L-BFGS-B 算法最小化函数 func。

参数
func可调用对象 f(x,*args)

要最小化的函数。

x0ndarray

初始猜测值。

fprime可调用对象 fprime(x,*args),可选

func 的梯度。如果为 None,则 func 返回函数值和梯度(f, g = func(x, *args)),除非 approx_grad 为 True,在这种情况下 func 只返回 f

args序列,可选

传递给 funcfprime 的参数。

approx_grad布尔值,可选

是否对梯度进行数值近似(在这种情况下 func 只返回函数值)。

bounds列表,可选

x 中每个元素的 (min, max) 对,定义了该参数的边界。当某个方向没有边界时,minmax 可使用 None 或 +-inf。

m整数,可选

用于定义有限内存矩阵的变量度量校正的最大数量。(有限内存 BFGS 方法不存储完整的 Hessian 矩阵,但使用这些项来近似它。)

factr浮点数,可选

(f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr * eps 时,迭代停止,其中 eps 是机器精度,由代码自动生成。factr 的典型值是:1e12 用于低精度;1e7 用于中等精度;10.0 用于极高精度。有关与 ftol 的关系,请参阅“备注”,ftol 通过 scipy.optimize.minimize 接口(而非 factr)暴露给 L-BFGS-B。

pgtol浮点数,可选

max{|proj g_i | i = 1, ..., n} <= pgtol 时,迭代将停止,其中 proj g_i 是投影梯度的第 i 个分量。

epsilon浮点数,可选

approx_grad 为 True 时,用于数值计算梯度的步长。

iprint整数,可选

已弃用的选项,以前用于控制问题解决期间屏幕上打印的文本。现在代码不输出任何内容,此关键字已无功能。

自 1.15.0 版本弃用:此关键字已弃用,并将从 SciPy 1.18.0 中移除。

disp整数,可选

已弃用的选项,以前用于控制问题解决期间屏幕上打印的文本。现在代码不输出任何内容,此关键字已无功能。

自 1.15.0 版本弃用:此关键字已弃用,并将从 SciPy 1.18.0 中移除。

maxfun整数,可选

函数评估的最大次数。请注意,由于通过数值微分评估梯度,此函数可能会违反此限制。

maxiter整数,可选

最大迭代次数。

callback可调用对象,可选

每次迭代后调用,形式为 callback(xk),其中 xk 是当前参数向量。

maxls整数,可选

线搜索步骤的最大次数(每次迭代)。默认为 20。

返回
x类数组

最小值的估计位置。

f浮点数

在最小值处 func 的值。

d字典

信息字典。

  • d[‘warnflag’] 为

    • 0 表示收敛,

    • 1 表示函数评估或迭代次数过多,

    • 2 表示因 d[‘task’] 中给出的其他原因停止

  • d[‘grad’] 是最小值处的梯度(应接近 0)

  • d[‘funcalls’] 是函数调用次数。

  • d[‘nit’] 是迭代次数。

另请参阅

minimize

多元函数最小化算法的接口。特别是请参阅“L-BFGS-B”方法。请注意,ftol 选项通过该接口提供,而 factr 则通过此接口提供,其中 factr 是乘以默认机器浮点精度以得到 ftol 的因子:ftol = factr * numpy.finfo(float).eps

备注

SciPy 使用的是 L-BFGS-B v3.0 Fortran 代码(2011 年 4 月 25 日发布,BSD-3 许可证)的 C 翻译和修改版本。原始 Fortran 版本由 Ciyou Zhu、Richard Byrd、Jorge Nocedal 和 Jose Luis Morales 编写。

参考文献

  • R. H. Byrd, P. Lu and J. Nocedal. A Limited Memory Algorithm for Bound Constrained Optimization, (1995), SIAM Journal on Scientific and Statistical Computing, 16, 5, pp. 1190-1208.

  • C. Zhu, R. H. Byrd and J. Nocedal. L-BFGS-B: Algorithm 778: L-BFGS-B, FORTRAN routines for large scale bound constrained optimization (1997), ACM Transactions on Mathematical Software, 23, 4, pp. 550 - 560.

  • J.L. Morales and J. Nocedal. L-BFGS-B: Remark on Algorithm 778: L-BFGS-B, FORTRAN routines for large scale bound constrained optimization (2011), ACM Transactions on Mathematical Software, 38, 1.

示例

通过 fmin_l_bfgs_b 解决线性回归问题。为此,我们首先定义一个目标函数 f(m, b) = (y - y_model)**2,其中 y 描述观测值,y_model 描述线性模型的预测,即 y_model = m*x + b。对于本示例,参数 mb 的边界任意选择为 (0,5)(5,10)

>>> import numpy as np
>>> from scipy.optimize import fmin_l_bfgs_b
>>> X = np.arange(0, 10, 1)
>>> M = 2
>>> B = 3
>>> Y = M * X + B
>>> def func(parameters, *args):
...     x = args[0]
...     y = args[1]
...     m, b = parameters
...     y_model = m*x + b
...     error = sum(np.power((y - y_model), 2))
...     return error
>>> initial_values = np.array([0.0, 1.0])
>>> x_opt, f_opt, info = fmin_l_bfgs_b(func, x0=initial_values, args=(X, Y),
...                                    approx_grad=True)
>>> x_opt, f_opt
array([1.99999999, 3.00000006]), 1.7746231151323805e-14  # may vary

x_opt 中的优化参数与真实参数 mb 一致。接下来,让我们使用 bounds 参数执行一个有界约束优化。

>>> bounds = [(0, 5), (5, 10)]
>>> x_opt, f_op, info = fmin_l_bfgs_b(func, x0=initial_values, args=(X, Y),
...                                   approx_grad=True, bounds=bounds)
>>> x_opt, f_opt
array([1.65990508, 5.31649385]), 15.721334516453945  # may vary