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


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


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

用法:

scipy.optimize.brute(func, ranges, args=(), Ns=20, full_output=0, finish=<function fmin>, disp=False, workers=1)#

通过蛮力最小化给定范围内的函数。

使用 “brute force” 方法,即计算函数在多维点网格的每个点的值,以找到函数的全局最小值。

按照vectorize NumPy 函数的强制执行,该函数在范围内的任何地方都使用第一次调用该函数的数据类型进行评估。当full_output=Truefinish 参数影响时返回的函数评估的值和类型(请参阅注释)。

蛮力方法效率低下,因为网格点的数量呈 index 增长 - 要评估的网格点数量为 Ns ** len(x) 。因此,即使使用粗网格间距,即使是中等大小的问题也可能需要很长时间才能运行,和/或遇到内存限制。

参数

func 可调用的

要最小化的目标函数。必须采用 f(x, *args) 的形式,其中 x 是一维数组形式的参数,而 args 是完全指定函数所需的任何其他固定参数的元组。

ranges 元组

的每个组件范围元组必须是 “slice object” 或形式为范围元组(low, high).该程序使用这些来创建将在其上计算目标函数的点网格。看笔记2了解更多详情。

args 元组,可选

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

Ns 整数,可选

如果未另行指定,则沿轴的网格点数。见注 2。

full_output 布尔型,可选

如果为 True,则返回评估网格及其上的目标函数值。

finish 可调用的,可选的

以蛮力最小化的结果作为初始猜测调用的优化函数。 finish 应该将 func 和初始猜测作为位置参数,并将 args 作为关键字参数。它还可以将 full_output 和/或 disp 作为关键字参数。如果不使用 “polishing” 函数,则使用 None。有关详细信息,请参阅注释。

disp 布尔型,可选

设置为 True 以打印来自完成可调用的收敛消息。

workers int 或 map-like 可调用,可选

如果工作人员是一个int,网格被细分为工作人员部分和并行评估(使用multiprocessing.Pool)。供应-1使用进程可用的所有内核。或者提供一个 map-like 可调用对象,例如多处理.Pool.map用于并行评估网格。本次评价为workers(func, iterable).要求函数可以 pickle 。

返回

x0 ndarray

包含目标函数具有最小值的点的坐标的一维数组。 (有关返回的点,请参见注 1。)

fval 浮点数

点 x0 处的函数值。 (当full_output 为真时返回。)

grid 元组

评估网格的表示。它的长度与 x0 相同。 (当full_output 为真时返回。)

Jout ndarray

评估网格每个点的函数值,即Jout = func(*grid). (返回时full_output是真的。)

注意

注1:程序找到目标函数出现最小值的网格点。如果结束为无,即返回的点。当全局最小值出现在网格边界之内(或不是很远)时,并且网格足够精细,该点将位于全局最小值附近。

但是,用户经常使用其他一些优化程序来“polish”网格点值,即在附近寻找更精确的(局部)最小值蛮力的最佳网格点。这brute职能结束选项提供了一种方便的方法来做到这一点。使用的任何抛光程序都必须采取蛮力的输出作为其初始猜测作为位置参数,并取蛮力的输入值参数作为关键字参数,否则将引发错误。它可能还需要full_output和/或显示作为关键字参数。

brute假设结束函数返回一个OptimizeResult对象或元组的形式:(xmin, Jmin, ... , statuscode),其中xmin是参数的最小化值,Jmin是目标函数的最小值,“…”可能是其他一些返回值(brute), 和statuscode是状态码结束程序。

请注意,当结束不是无,返回的值是那些结束程序,不是网格点的。因此,虽然brute将其搜索限制在输入网格点,结束程序的结果通常不会与任何网格点重合,并且可能落在网格边界之外。因此,如果只需要在提供的网格点上找到最小值,请确保传入完成=无.

笔记2:点的网格是numpy.mgrid目的。为了brute 范围NS输入具有以下效果。的每个组件范围tuple 可以是切片对象,也可以是给出一系列值的二元组,例如 (0, 5)。如果组件是切片对象,brute直接使用它。如果组件是一个二元组范围,brute在内部将其转换为插入的切片对象NS从它的low-value 指向它的high-value,包括在内。

例子

我们举例说明使用brute寻求两个变量的函数的全局最小值,该函数作为正定二次和两个深 “Gaussian-shaped” 陨石坑之和给出。具体来说,定义目标函数f作为其他三个函数的总和,f = f1 + f2 + f3.我们假设每个都有一个签名(z, *params),其中z = (x, y), 和params函数定义如下。

>>> import numpy as np
>>> params = (2, 3, 7, 8, 9, 10, 44, -1, 2, 26, 1, -2, 0.5)
>>> def f1(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (a * x**2 + b * x * y + c * y**2 + d*x + e*y + f)
>>> def f2(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (-g*np.exp(-((x-h)**2 + (y-i)**2) / scale))
>>> def f3(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (-j*np.exp(-((x-k)**2 + (y-l)**2) / scale))
>>> def f(z, *params):
...     return f1(z, *params) + f2(z, *params) + f3(z, *params)

因此,目标函数可能在其组成的三个函数中的每一个函数的最小值附近具有局部最小值。要使用 fmin 来打磨它的网格点结果,我们可以继续如下:

>>> rranges = (slice(-4, 4, 0.25), slice(-4, 4, 0.25))
>>> from scipy import optimize
>>> resbrute = optimize.brute(f, rranges, args=params, full_output=True,
...                           finish=optimize.fmin)
>>> resbrute[0]  # global minimum
array([-1.05665192,  1.80834843])
>>> resbrute[1]  # function value at global minimum
-3.4085818767

请注意,如果结束已设置为无,我们将获得网格点 [-1.0 1.75],其中舍入函数值为 -2.892。

相关用法


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