scipy.optimize.

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)

要最小化的函数。必须满足以下条件之一:

  1. 返回 f 和 g,其中 f 是函数值,g 是其梯度(浮点数列表)。

  2. 返回函数值,但将梯度函数作为 fprime 单独提供。

  3. 返回函数值并设置 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 中每个元素的 (min, max) 对,定义该参数的界限。如果某个方向没有界限,则使用 None 或 +/-inf 来表示 min 或 max。

epsilon浮点数, 可选

如果 approx_grad 为 True 则使用。fprime 的有限差分近似中的步长。

scale类数组对象, 可选

应用于每个变量的缩放因子。如果为 None,则对于区间有界变量,因子为 up-low,对于其他变量为 1+|x|。默认为 None。

offset类数组对象, 可选

从每个变量中减去的值。如果为 None,则对于区间有界变量,偏移量为 (up+low)/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,则重新缩放设置为 1.3。

callback可调用对象, 可选

在每次迭代后调用,形式为 callback(xk),其中 xk 是当前的参数向量。

返回:
xndarray

解。

nfeval整数

函数评估的次数。

rc整数

返回码,见下文

另请参阅

minimize

多元函数最小化算法的接口。特别是请参阅 ‘TNC’ 方法

备注

底层算法是截断牛顿法,也称为牛顿共轭梯度法。此方法与 scipy.optimize.fmin_ncg 的不同之处在于:

  1. 它封装了该算法的 C 语言实现

  2. 它允许为每个变量设置上限和下限。

该算法通过确定下降方向(如同无约束的截断牛顿法),但从不采取足够大的步长以离开可行 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