我使用scipy.optimize.basinhopping
来查找标量函数的最小值。我想知道是否有可能禁用scipy.optimize.basinhopping的局部最小化部分?正如我们从下面的输出消息中看到的那样,minimization_failures
和nit
几乎相同,表明局部最小化部分对于流域购物的全局优化过程可能毫无用处 - 这也是我想要的原因为了提高效率,禁用局部最小化部分。
答案 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的流域购物算法的工作方式如下:
算法是迭代的,每个循环由以下组成 特征
- 坐标的随机扰动
- 本地最小化接受或
- 根据最小化的函数值拒绝新坐标
如果以上是准确的,则无法完全跳过局部最小化步骤,因为算法需要其输出继续进行,即保持或丢弃新坐标。但是,我不是这个算法的专家。