scipy.optimize.brute¶
- scipy.optimize.brute(func, ranges, args=(), Ns=20, full_output=0, finish=<function fmin>, disp=False, workers=1)[源代码]¶
通过暴力使函数在给定范围内最小化。
使用“蛮力”方法,即计算函数在多维点阵的每个点上的值,以求出函数的全局最小值。
函数使用第一次调用该函数的数据类型在范围内的任何位置求值,这由
vectorize
NumPy函数。时返回的函数求值的值和类型full_output=True
除受其他因素影响外,还受finish
参数(请参见注释)。强力方法效率低下,因为网格点的数量呈指数增长-要评估的网格点的数量为
Ns ** len(x)
。因此,即使使用粗略的网格间距,即使中等大小的问题也可能需要很长时间才能运行,并且/或者会遇到内存限制。- 参数
- func可调用
要最小化的目标函数。必须在表格中
f(x, *args)
,在哪里x
是一维数组形式的参数,并且args
是完全指定函数所需的任何附加固定参数的元组。- ranges元组
的每个组件 ranges 元组必须是表单的“切片对象”或范围元组
(low, high)
。该程序使用这些来创建将在其上计算目标函数的点的网格。看见 Note 2 了解更多详细信息。- args元组,可选
完全指定函数所需的任何附加固定参数。
- Ns整型,可选
沿轴的栅格点数量(如果未另行指定)。看见 Note2 。
- full_output布尔值,可选
如果为True,则返回评估网格及其目标函数的值。
- finish可调用,可选
以暴力最小化的结果作为初始猜测调用的优化函数。 finish 应该带上 func 和最初的猜测作为位置论元,并将 args 作为关键字参数。它可能还需要额外的时间 full_output 和/或 disp 作为关键字参数。如果不使用“抛光”功能,请使用“无”。有关更多详细信息,请参阅注释。
- disp布尔值,可选
设置为True可打印来自 finish 可召回的。
- workers整型或映射型可调用,可选
如果 workers 是网格细分为 workers 部分并并行计算(使用
multiprocessing.Pool
)。供应 -1 使用该进程可用的所有核心。或者,也可以提供类似于映射的可调用对象,例如 multiprocessing.Pool.map 用于并行计算网格。此评估按如下方式进行workers(func, iterable)
。要求 func 是可以腌制的。1.3.0 新版功能.
- 退货
- x0ndarray
包含目标函数具有最小值的点的坐标的一维数组。(请参阅 Note 1 该点将被返回。)
- fval浮动
该点处的函数值 x0 。(在以下情况下返回 full_output 为真。)
- grid元组
评估网格的表示形式。它的长度与 x0 。(在以下情况下返回 full_output 为真。)
- Joutndarray
在评估网格的每个点处的函数值,即,
Jout = func(*grid)
。(在以下情况下返回 full_output 为真。)
注意事项
注1 :程序找出目标函数的最低值出现的网格点。如果 finish 为NONE,则这是返回点。当全局最小值出现在栅格边界内(或不是离栅格边界很远),并且栅格足够精细时,该点将位于全局最小值附近。
然而,用户通常使用一些其他优化程序来“打磨”GridPoint值,即寻求更精确的(局部)最小值NEAR brute's 最佳网格点。这个
brute
函数的 finish 选项提供了一种方便的方式来实现这一点。任何使用的抛光程序都必须 brute's OUTPUT作为其初始猜测作为位置参数,并将 brute's 的输入值 args 作为关键字参数,否则将引发错误。它可能还需要额外的时间 full_output 和/或 disp 作为关键字参数。brute
假设 finish 函数返回一个OptimizeResult
对象或表单中的元组:(xmin, Jmin, ... , statuscode)
,在哪里xmin
是参数的最小值,Jmin
是目标函数的最小值,“.”可以是其他一些返回值(未由使用brute
),以及statuscode
的状态代码。 finish 程序。请注意,当 finish 不是NONE,则返回的值是 finish 程序, not 网格点的那些。因此,虽然
brute
将其搜索限制在输入网格点,则 finish 程序的结果通常不会与任何网格点重合,并且可能落在网格边界之外。因此,如果只需要在提供的格点上找到最小值,请确保传入 finish=None 。注2 :点的栅格是一个
numpy.mgrid
对象。为brute
这个 ranges 和 Ns 输入具有以下效果。的每个组件 ranges 元组可以是切片对象,也可以是给出值范围的二元组,例如(0,5)。如果组件是切片对象,brute
直接使用它。如果组件是二元组范围,brute
在内部将其转换为插值的切片对象 Ns 从低价值到高价值,包罗万象。示例
我们举例说明了
brute
求两个变量函数的全局最小值,该函数是一个正定的二次型和两个深的“高斯型”陨石坑的总和。具体地说,定义目标函数 f 作为其他三个函数的总和,f = f1 + f2 + f3
。我们想每个人都有自己的签名(z, *params)
,在哪里z = (x, y)
,以及params
功能定义如下。>>> 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
为了完善其GridPoint结果,我们可以继续如下操作:>>> 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
请注意,如果 finish 如果设置为None,我们将获得GridPoint [-1.0 1.75] 其中,四舍五入的函数值是-2.892。