【问题标题】:How to disable the local minimization process in scipy.optimize.basinhopping?如何在 scipy.optimize.basinhopping 中禁用本地最小化过程?
【发布时间】:2015-01-13 21:54:50
【问题描述】:

我正在使用scipy.optimize.basinhopping 来查找标量函数的最小值。我想知道是否可以禁用 scipy.optimize.basinhopping 的局部最小化部分?从下面的输出信息我们可以看到,minimization_failuresnit几乎是一样的,说明局部最小化部分可能对basinhopping的全局优化过程没用---我为什么要禁用局部为了效率,最小化部分。

【问题讨论】:

  • 这不只是意味着你在随机选择值吗?

标签: python scipy


【解决方案1】:

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

参见“自定义最小化器”in the documentation of minimize() 的讨论:

**自定义最小化器** 例如,传递自定义最小化方法可能很有用 当使用此方法的前端时,例如`scipy.optimize.basinhopping` 或不同的图书馆。您可以简单地将可调用对象作为“方法”传递 范围。 可调用的被称为``method(fun, x0, args, **kwargs, **options)`` 其中 ``kwargs`` 对应于传递给 `minimize` 的任何其他参数 (例如`callback`,`hess`等),除了`options` dict,它有 它的内容也作为“方法”参数逐对传递。另外,如果 `jac` 已作为 bool 类型传递,`jac` 和 `fun` 被破坏,因此 `fun` 只返回函数值,而 `jac` 被转换为函数 返回雅可比行列式。该方法应返回一个“OptimizeResult” 目的。 提供的“方法”可调用必须能够接受(并且可能忽略) 任意参数; `minimize` 接受的参数集可能 在未来的版本中展开,然后将这些参数传递给 方法。您可以在 scipy.optimize 教程中找到一个示例。

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

from scipy.optimize import OptimizeResult
def noop_min(fun, x0, args, **options):
    return OptimizeResult(x=x0, fun=fun(x0), success=True, nfev=1)

...

sol = basinhopping(..., minimizer_kwargs=dict(method=noop_min))

注意:我不知道跳过局部最小化如何影响盆地跳跃算法的收敛特性。

【讨论】:

  • 如果我们避免在 Basin Hopping 中运行最小化器,那么它不是有效地变成模拟退火吗?
【解决方案2】:

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

然后取决于您向minimize 询问哪种类型的求解器。您可以尝试设置更大的tol 以使局部最小化步骤提前终止。

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

文档中的盆地跳跃算法的工作原理如下:

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

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

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

【讨论】:

  • 感谢您的信息。如果我想完全禁用局部最小化部分怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2017-11-10
相关资源
最近更新 更多