如何在scipy.optimize.basinhopping中禁用本地最小化过程?

时间:2015-01-09 13:56:42

标签: python scipy

我使用scipy.optimize.basinhopping来查找标量函数的最小值。我想知道是否有可能禁用scipy.optimize.basinhopping的局部最小化部分?正如我们从下面的输出消息中看到的那样,minimization_failuresnit几乎相同,表明局部最小化部分对于流域购物的全局优化过程可能毫无用处 - 这也是我想要的原因为了提高效率,禁用局部最小化部分。

enter image description here

2 个答案:

答案 0 :(得分:5)

您可以使用不执行任何操作的自定义最小化器来避免运行最小化器。

参见"定制最小化器" in the documentation of minimize()

 **Custom minimizers**
It may be useful to pass a custom minimization method, for example
when using a frontend to this method such as `scipy.optimize.basinhopping`
or a different library. You can simply pass a callable as the ``method``
parameter.
The callable is called as ``method(fun, x0, args, **kwargs, **options)``
where ``kwargs`` corresponds to any other parameters passed to `minimize`
(such as `callback`, `hess`, etc.), except the `options` dict, which has
its contents also passed as `method` parameters pair by pair. Also, if
`jac` has been passed as a bool type, `jac` and `fun` are mangled so that
`fun` returns just the function values and `jac` is converted to a function
returning the Jacobian. The method shall return an ``OptimizeResult``
object.
The provided `method` callable must be able to accept (and possibly ignore)
arbitrary parameters; the set of parameters accepted by `minimize` may
expand in future versions and then these parameters will be passed to
the method. You can find an example in the scipy.optimize tutorial.

基本上,您需要编写一个返回OptimizeResult的自定义函数,并通过method的{​​{1}}部分将其传递给basinhopping,例如

minimizer_kwargs

注意:我不知道跳过局部最小化会如何影响流水线算法的收敛性。

答案 1 :(得分:2)

您可以使用minimizer_kwargs指定minimize()您更喜欢本地最小化步骤的选项。请参阅docs的专用部分。

然后由您提出minimize所要求的解算器类型。您可以尝试设置较大的tol以使本地最小化步骤更早终止。

编辑,回复评论"如果我想完全禁用本地最小化部分怎么办?"

来自docs的流域购物算法的工作方式如下:

  

算法是迭代的,每个循环由以下组成   特征

     
      
  • 坐标的随机扰动
  •   
  • 本地最小化接受或
  •   
  • 根据最小化的函数值拒绝新坐标
  •   

如果以上是准确的,则无法完全跳过局部最小化步骤,因为算法需要其输出继续进行,即保持或丢弃新坐标。但是,我不是这个算法的专家。