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。
- 参数:
- 函数可调用函数 f(x,*args)
要最小化的函数。
- x0ndarray
初始猜测。
- fprime可调用函数 fprime(x,*args),可选
func 的梯度。如果为 None,则 func 返回函数值和梯度(
f, g = func(x, *args)
),除非 approx_grad 为 True,在这种情况下 func 仅返回f
。- 参数序列,可选
传递给 func 和 fprime 的参数。
- approx_gradbool, 可选
是否通过数值近似梯度(在这种情况下,func 仅返回函数值)。
- 边界列表,可选
(min, max)
对x
中的每个元素定义了该参数的边界。当在该方向上没有边界时,对min
或max
中的一个使用 None 或 +-inf。- 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 的关系,ftol 由scipy.optimize.minimize
接口暴露给 L-BFGS-B(而不是 factr)。- 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
每 iprint 次迭代打印 f 和|proj g|
;iprint = 99
打印每次迭代的详细信息,除了 n 向量;iprint = 100
还打印活动集的变化和最终的 x;iprint > 100
打印每次迭代的详细信息,包括 x 和 g。- dispint, 可选
如果为零,则没有输出。如果为正数,则此值会覆盖 iprint`(即,`iprint 的值变为 disp 的值)。
- maxfunint, 可选
最大函数评估次数。请注意,由于通过数值微分评估梯度,此函数可能会违反限制。
- maxiterint, 可选
最大迭代次数。
- 回调可调用,可选
在每次迭代后调用,形式为
callback(xk)
,其中xk
是当前的参数向量。- maxlsint, 可选
每迭代最大线搜索步数。默认是 20。
- 返回:
- xarray_like
最小值的估计位置。
- f浮动
func 在最小值处的值。
- ddict
信息字典。
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
。
注释
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 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 和 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
。参数 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