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=-1, maxfun=15000, maxiter=15000, disp=None, callback=None, maxls=20)[源代码]#

使用 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_gradbool,可选

是否以数值方式近似梯度(在这种情况下,func 仅返回函数值)。

bounds列表,可选

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

mint,可选

用于定义有限内存矩阵的可变度量校正的最大数量。(有限内存 BFGS 方法不存储完整的黑塞矩阵,而是使用这么多项来近似它。)

factrfloat,可选

(f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr * eps 时,迭代停止,其中 eps 是机器精度,由代码自动生成。 factr 的典型值为:低精度为 1e12;中等精度为 1e7;极高精度为 10.0。有关与 ftol 的关系,请参阅注释,ftolscipy.optimize.minimize 接口公开(而不是 factr)。

pgtolfloat,可选

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

epsilonfloat,可选

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

iprintint,可选

已弃用的选项,以前控制问题解决方案期间屏幕上打印的文本。现在代码不发出任何输出,并且此关键字没有任何功能。

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

dispint,可选

已弃用的选项,以前控制问题解决方案期间屏幕上打印的文本。现在代码不发出任何输出,并且此关键字没有任何功能。

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

maxfunint,可选

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

maxiterint,可选

最大迭代次数。

callback可调用对象,可选

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

maxlsint,可选

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

返回:
xarray_like

最小值的估计位置。

ffloat

func 在最小值处的值。

ddict

信息字典。

  • d[‘warnflag’] 为

    • 0 如果收敛,

    • 1 如果函数评估次数过多或迭代次数过多,

    • 2 如果由于其他原因停止,则在 d[‘task’] 中给出

  • d[‘grad’] 是最小值处的梯度(应为 0 左右)

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

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

参见

minimize

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

注释

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

参考文献

  • R. H. Byrd、P. Lu 和 J. Nocedal。用于约束优化的有限内存算法,(1995),SIAM 科学与统计计算杂志,16,5,第 1190-1208 页。

  • C. Zhu、R. H. Byrd 和 J. Nocedal。L-BFGS-B:算法 778:L-BFGS-B,用于大规模约束优化的 FORTRAN 例程(1997),ACM 数学软件事务,23,4,第 550 - 560 页。

  • J.L. Morales 和 J. Nocedal。L-BFGS-B:关于算法 778 的注释:L-BFGS-B,用于大规模约束优化的 FORTRAN 例程(2011),ACM 数学软件事务,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