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序列,可选
传递给 func 和 fprime 的参数。
- approx_grad布尔值,可选
是否对梯度进行数值近似(在这种情况下 func 只返回函数值)。
- bounds列表,可选
x
中每个元素的(min, max)
对,定义了该参数的边界。当某个方向没有边界时,min
或max
可使用 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
。对于本示例,参数m
和b
的边界任意选择为(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
中的优化参数与真实参数m
和b
一致。接下来,让我们使用 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