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序列,可选
要传递给 func 和 fprime 的参数。
- approx_gradbool,可选
是否以数值方式近似梯度(在这种情况下,func 仅返回函数值)。
- bounds列表,可选
每个
x
中的元素的(min, max)
对,定义该参数的边界。当该方向没有边界时,对于min
或max
之一,请使用 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 的关系,请参阅注释,ftol 由scipy.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
。对于此示例,参数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