当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy optimize.direct用法及代码示例


本文简要介绍 python 语言中 scipy.optimize.direct 的用法。

用法:

scipy.optimize.direct(func, bounds, *, args=(), eps=0.0001, maxfun=None, maxiter=1000, locally_biased=True, f_min=-inf, f_min_rtol=0.0001, vol_tol=1e-16, len_tol=1e-06, callback=None)#

使用 DIRECT 算法查找函数的全局最小值。

参数

func 可调用的

要最小化的目标函数。 func(x, *args) -> float,其中 x 是形状为 (n,) 的一维数组,args 是完整指定函数所需的固定参数的元组。

bounds 序列或 Bounds

变量的界限。有两种方法可以指定边界:

  1. Bounds 类的实例。

  2. (min, max)x 中的每个元素进行配对。

args 元组,可选

完全指定目标函数所需的任何其他固定参数。

eps 浮点数,可选

当前最佳超矩形与要划分的下一个潜在最佳超矩形之间的目标函数值所需的最小差异。因此,eps 充当局部搜索和全局搜索之间的权衡:越小,搜索就越局部。默认值为 1e-4。

maxfun int 或无,可选

目标函数评估的近似上限。如果None,将自动设置为1000 * N其中N表示维数。如有必要,将设置上限,以限制应用程序的 DIRECT RAM 使用量。 1GiB。这只会发生在非常高维度的问题和过多的情况下max_fun.默认为None.

maxiter 整数,可选

最大迭代次数。默认值为 1000。

locally_biased 布尔型,可选

如果为 True(默认值),则使用称为 DIRECT_L 的算法的局部偏置变体。如果为 False,则使用原始无偏 DIRECT 算法。对于具有许多局部最小值的难题,建议使用 False。

f_min 浮点数,可选

全局最优的函数值。仅当全局最优值已知时才设置此值。默认值为 -np.inf ,因此该终止标准被停用。

f_min_rtol 浮点数,可选

一旦当前最佳最小值 f 与提供的全局最小值 f_min 之间的相对误差小于 f_min_rtol,则终止优化。仅当还设置了 f_min 时才使用此参数。必须介于 0 和 1 之间。默认值为 1e-4。

vol_tol 浮点数,可选

一旦包含最低函数值的超矩形的体积小于完整搜索空间的vol_tol,则终止优化。必须介于 0 和 1 之间。默认值为 1e-16。

len_tol 浮点数,可选

如果locally_biased=True,一旦包含最低函数值的超矩形的归一化最大边长的一半小于len_tol,则终止优化。如果locally_biased=False,一旦包含最低函数值的超矩形的归一化对角线的一半小于len_tol,则终止优化。必须介于 0 和 1 之间。默认值为 1e-6。

callback 可调用的,可选的

具有签名 callback(xk) 的回调函数,其中 xk 表示迄今为止找到的最佳函数值。

返回

res OptimizeResult

优化结果表示为 OptimizeResult 对象。重要的属性是:x 解决方案数组,success 指示优化器是否成功退出的布尔标志和说明终止原因的 message。有关其他属性的说明,请参见 OptimizeResult

注意

DIviding RECTangles (DIRECT) 是一种确定性全局优化算法,能够通过对搜索空间中的潜在解决方案进行采样来最小化黑盒函数,其变量受下限和上限约束[1]。该算法首先将搜索空间标准化为 n 维单位超立方体。它在此超立方体的中心和 2n 个(n 是变量的数量)个点(每个坐标方向上 2 个)对函数进行采样。然后,DIRECT 使用这些函数值将域划分为超矩形,每个超矩形恰好以一个采样点作为其中心。在每次迭代中,DIRECT 使用每股收益参数默认为1e-4,对现有的一些超矩形进行进一步划分。此除法过程持续进行,直到超过允许的最大迭代次数或最大函数计算次数,或者包含迄今为止找到的最小值的超矩形变得足够小。如果f_min指定后,一旦该函数值达到相对容差范围内,优化就会停止。 DIRECT 的局部偏置变体(最初称为 DIRECT_L)[2]默认使用。对于只有几个局部极小值的情况,它使搜索更具局部偏差且更有效。

关于终止标准的说明:vol_tol指的是迄今为止找到的包含最低函数值的超矩形的体积。随着问题维度的增加,这个体积呈指数下降。所以vol_tol应减少以避免算法过早终止更高维度。这不适用于len_tol:它指的是最大边长的一半(对于locally_biased=True)或超矩形对角线的一半(对于locally_biased=False)。

该代码基于 Gablonsky 等人的 DIRECT 2.0.4 Fortran 代码。在https://ctk.math.ncsu.edu/SOFTWARE/DIRECTv204.tar.gz。这个原始版本最初是通过 f2c 转换的,然后由 Steven G. Johnson 于 2007 年 8 月为 NLopt 项目进行清理和重组。 direct 函数包装了 C 实现。

参考

[1]

琼斯,D.R.,佩图宁,C.D. & 斯塔克曼,B.E.没有 Lipschitz 常数的 Lipschitz 优化。 《最优理论应用杂志》79, 157-181 (1993)。

[2]

Gablonsky, J.,Kelley, C. DIRECT 算法的 Locally-Biased 形式。全局优化杂志 21, 27-37 (2001)。

例子

以下示例是具有四个局部最小值的二维问题:最小化 Styblinski-Tang 函数(https://en.wikipedia.org/wiki/Test_functions_for_optimization)。

>>> from scipy.optimize import direct, Bounds
>>> def styblinski_tang(pos):
...     x, y = pos
...     return 0.5 * (x**4 - 16*x**2 + 5*x + y**4 - 16*y**2 + 5*y)
>>> bounds = Bounds([-4., -4.], [4., 4.])
>>> result = direct(styblinski_tang, bounds)
>>> result.x, result.fun, result.nfev
array([-2.90321597, -2.90321597]), -78.3323279095383, 2011

找到了正确的全局最小值,但进行了大量的函数评估(2011)。放宽终止容差vol_tol 和len_tol 可用于提前停止 DIRECT。

>>> result = direct(styblinski_tang, bounds, len_tol=1e-3)
>>> result.x, result.fun, result.nfev
array([-2.9044353, -2.9044353]), -78.33230330754142, 207

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.optimize.direct。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。