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)[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_gradbool,可选

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

boundslist,可选

(min, max)x中每个元素成对的范围定义,该参数的界限。当该方向无界限时,对minmax之一使用 None 或正、负无穷大。

mint,可选

用于定义受限内存矩阵的可变指标校正的最大数。(受限内存 BFGS 方法不存储完整的 Hessian,但使用这么多个项来估计它。)

factrfloat,可选

(f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr * eps停止迭代,其中eps由代码自动生成的机器精度。factr 常见值为:精度低为 1e12;精度适中为 1e7;精度极高为 10.0。请参阅注释,了解与ftol的关系,后者由scipy.optimize.minimize界面公开(代替factr)向 L-BFGS-B。

pgtolfloat,可选

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

epsilonfloat,可选

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

iprintint,可选

控制输出频率。iprint < 0 意味着没有输出;iprint = 0 仅在最后一次迭代打印一行;0 < iprint < 99 次迭代同时打印 f 和 |proj g|iprint = 99 打印每个迭代(n-vector 除外)的详细信息;iprint = 100 同时打印活动集和最终 x 的变化;iprint > 100 打印每个迭代(包括 x 和 g)的详细信息。

dispint,可选

如果为零,则不输出。如果是正数,则会覆盖 iprint(即 iprint 获取 disp 的值)。

maxfunint,可选

函数计算的最大次数。要注意,因为对梯度进行数值差分,所以本函数可能会违反该限制。

maxiterint,可选

最大迭代次数。

callback可调用的,可选

在每个迭代后调用,如 callback(xk),其中 xk 是当前参数向量。

maxlsint,可选

最大行搜索步长(每次迭代)。默认为 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 是对默认机器浮点精度进行乘法的系数,用于计算ftolftol = factr * numpy.finfo(float).eps

注释

L-BFGS-B(FORTRAN 代码)许可

此处的版本(FORTRAN 代码)为 3.0(2011 年 4 月 25 日发布)。其作者为 Ciyou Zhu、Richard Byrd 和 Jorge Nocedal <nocedal@ece.nwu.edu>。使用该软件时,应遵守以下条件:

该软件是免费提供的,但我们希望所有描述使用该软件的产品或使用该软件的所有商业产品发表的所有出版物至少引用以下给出的参考之一。该软件采用 BSD 许可发布。

参考

  • 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