fmin_tnc#
- scipy.optimize.fmin_tnc(func, x0, fprime=None, args=(), approx_grad=0, bounds=None, epsilon=1e-08, scale=None, offset=None, messages=15, maxCGit=-1, maxfun=None, eta=-1, stepmx=0, accuracy=0, fmin=0, ftol=-1, xtol=-1, pgtol=-1, rescale=-1, disp=None, callback=None)[源代码]#
使用截断牛顿算法,在变量受约束的情况下最小化函数。此方法封装了算法的 C 实现。
- 参数:
- func可调用
func(x, *args)
要最小化的函数。必须执行以下操作之一:
返回 f 和 g,其中 f 是函数的值,g 是其梯度(浮点数列表)。
返回函数值,但将梯度函数单独作为 fprime 提供。
返回函数值并设置
approx_grad=True
。
如果函数返回 None,则中止最小化。
- x0类数组
最小值的初始估计。
- fprime可调用
fprime(x, *args)
,可选 func 的梯度。如果为 None,则 func 必须返回函数值和梯度(
f,g = func(x, *args)
),或者 approx_grad 必须为 True。- args元组,可选
传递给函数的参数。
- approx_grad布尔值,可选
如果为 True,则以数值方式逼近梯度。
- bounds列表,可选
x0 中每个元素的 (最小值,最大值) 对,定义该参数的边界。当该方向没有边界时,对最小值或最大值使用 None 或 +/-inf。
- epsilon浮点数,可选
如果 approx_grad 为 True,则使用此值。用于 fprime 的有限差分逼近的步长。
- scale类数组,可选
应用于每个变量的缩放因子。如果为 None,则对于区间有界变量,因子为 upper-lower;对于其他变量,因子为 1+|x|。默认为 None。
- offset类数组,可选
从每个变量中减去的值。如果为 None,则对于区间有界变量,偏移量为 (upper+lower)/2;对于其他变量,偏移量为 x。
- messages整数,可选
用于选择最小化过程中显示的消息的位掩码。在 MSGS 字典中定义的值。默认为 MGS_ALL。
- disp整数,可选
消息的整数接口。0 = 无消息,5 = 所有消息
- maxCGit整数,可选
每次主迭代的最大 hessian*vector 评估次数。如果 maxCGit == 0,则选择的方向为 -梯度;如果 maxCGit < 0,则 maxCGit 设置为 max(1,min(50,n/2))。默认为 -1。
- maxfun整数,可选
最大函数评估次数。如果为 None,则 maxfun 设置为 max(100, 10*len(x0))。默认为 None。请注意,此函数可能会由于通过数值微分评估梯度而违反限制。
- eta浮点数,可选
线搜索的严格程度。如果 < 0 或 > 1,则设置为 0.25。默认为 -1。
- stepmx浮点数,可选
线搜索的最大步长。可以在调用期间增加。如果太小,则设置为 10.0。默认为 0。
- accuracy浮点数,可选
用于有限差分计算的相对精度。如果 <= machine_precision,则设置为 sqrt(machine_precision)。默认为 0。
- fmin浮点数,可选
最小函数值估计。默认为 0。
- ftol浮点数,可选
停止条件中 f 值的精度目标。如果 ftol < 0.0,则 ftol 设置为 0.0。默认为 -1。
- xtol浮点数,可选
停止条件中 x 值的精度目标(在应用 x 缩放因子之后)。如果 xtol < 0.0,则 xtol 设置为 sqrt(machine_precision)。默认为 -1。
- pgtol浮点数,可选
停止条件中投影梯度的精度目标(在应用 x 缩放因子之后)。如果 pgtol < 0.0,则 pgtol 设置为 1e-2 * sqrt(accuracy)。不建议将其设置为 0.0。默认为 -1。
- rescale浮点数,可选
用于触发 f 值重新缩放的缩放因子(以 log10 为单位)。如果为 0,则在每次迭代时重新缩放。如果为较大值,则永不重新缩放。如果 < 0,则 rescale 设置为 1.3。
- callback可调用,可选
在每次迭代后调用,作为 callback(xk),其中 xk 是当前参数向量。
- func可调用
- 返回:
- xndarray
解。
- nfeval整数
函数评估的次数。
- rc整数
返回代码,请参见下文
另请参阅
minimize
用于多元函数的最小化算法的接口。请特别参阅 ‘TNC’ method。
注释
底层算法是截断牛顿法,也称为牛顿共轭梯度法。此方法与 scipy.optimize.fmin_ncg 的不同之处在于:
它封装了算法的 C 实现
它允许为每个变量设置上限和下限。
该算法通过确定下降方向(如在无约束截断牛顿中)来合并边界约束,但永远不会采用足够大的步长来离开可行 x 的空间。该算法会跟踪一组当前活动的约束,并在计算最小允许步长时忽略它们。(与活动约束关联的 x 保持固定。)如果最大允许步长为零,则会添加新的约束。在每次迭代结束时,一个约束可能被认为不再活动并被删除。如果约束当前处于活动状态,但该变量的梯度从约束内部指向,则该约束被认为不再活动。删除的特定约束是与最大索引的变量关联的约束,该变量的约束不再处于活动状态。
返回代码定义如下:
-1
: 不可行(下限 > 上限)0
: 到达局部最小值 (\(|pg| \approx 0\))1
: 已收敛 (\(|f_n-f_(n-1)| \approx 0\))2
: 已收敛 (\(|x_n-x_(n-1)| \approx 0\))3
: 已达到最大函数评估次数4
: 线性搜索失败5
: 所有下界都等于上界6
: 无法继续优化7
: 用户请求停止最小化
参考文献
Wright S., Nocedal J. (2006), ‘数值优化’
Nash S.G. (1984), “通过 Lanczos 方法进行牛顿型最小化”, SIAM Journal of Numerical Analysis 21, pp. 770-778