【问题标题】:Find global minimum using scipy.optimize.minimize使用 scipy.optimize.minimize 查找全局最小值
【发布时间】:2016-09-10 07:55:29
【问题描述】:

给定一个二维点p,我正在尝试计算该点与功能曲线之间的最小距离,即在曲线上找到距离p 最小的点,然后计算那个距离。我正在使用的示例函数是

f(x) = 2*sin(x)

我的某个点p与提供的函数之间的距离的距离函数是

def dist(p, x, func):
    x = np.append(x, func(x))
    return sum([[i - j]**2 for i,j in zip(x,p)])

它将点p、函数上的位置x 和函数句柄func 作为输入。请注意,这是一个平方欧几里得距离(因为在欧几里得空间中最小化与在平方欧几里得空间中最小化相同)。

这其中的关键部分是我希望能够为我的函数提供边界,所以我真的在寻找到函数段的最近距离。对于这个例子,我的界限是

bounds = [0, 2*np.pi]

我正在使用scipy.optimize.minimize 函数来最小化我的距离函数,使用边界。上述过程的结果如下图所示。

这是一个等高线图,显示了与 sin 函数的距离。请注意轮廓中似乎存在不连续性。为方便起见,我在该不连续点周围绘制了几个点,以及它们映射到的曲线上的“壁橱”点。

这里实际发生的是 scipy 函数正在寻找局部最小值(给定一些初步猜测),但不是全局最小值,这导致了不连续性。我知道找到任何函数的全局最小值是不可能的,但我正在寻找一种更可靠的方法来找到全局最小值。

寻找全局最小值的可能方法是

  1. 选择一个聪明的初始猜测,但这相当于大致知道全局最小值从哪里开始,即使用问题的解决方案来解决它。
  2. 使用多个初始猜测并选择得到最佳最小值的答案。然而,这似乎是一个糟糕的选择,尤其是当我的函数变得更复杂(和更高维度)时。
  3. 找到最小值,然后扰乱解决方案并再次找到最小值,希望我可能已经将它敲到了一个更好的最小值。我希望也许有一些方法可以简单地做到这一点,而不会引起一些复杂的 MCMC 算法或类似的东西。这个过程的速度很重要。

任何有关解决此问题的最佳方法的建议,或可能解决此问题的有用功能的方向都会很棒!

【问题讨论】:

  • 4.使用模拟退火激励算法(或任何其他元启发式算法)。也许将您的优化调用限制为非常低的迭代,获取解决方案并让 SA 决定是否接受此解决方案。再次优化 5. 使用不同的优化算法(随机选择或并行或竞争)。 6. 尝试 ipopt、bonmin、couenne 之类的重的东西(最后一个是全局求解器)

标签: python algorithm scipy minimize


【解决方案1】:

根据评论中的建议,您可以尝试全局优化算法,例如 scipy.optimize.differential_evolution。但是,在这种情况下,如果您有一个定义明确且易于分析的目标函数,您可以采用半分析方法,最大限度地利用一阶必要条件。

在下文中,第一个函数是距离度量,第二个函数是它的导数 w.r.t(的分子)。 x,如果在某个 0<x<2*np.pi 出现最小值,则该值应为零。

import numpy as np    
def d(x, p):
    return np.sum((p-np.array([x,2*np.sin(x)]))**2)

def diff_d(x, p):
    return -2 * p[0] + 2 * x - 4 * p[1] * np.cos(x) + 4 * np.sin(2*x)

现在,给定一个点pd(x,p) 的唯一潜在最小化点是diff_d(x,p) 的根(如果有的话),以及边界点x=0x=2*np.pi。事实证明,diff_d 可能有多个根。注意到导数是一个连续函数,pychebfun 库提供了一种非常有效的方法来查找所有根,避免了基于scipy 求根算法的繁琐方法。

以下函数为给定点p 提供d(x, p) 的最小值:

import pychebfun
def min_dist(p):
    f_cheb = pychebfun.Chebfun.from_function(lambda x: diff_d(x, p), domain = (0,2*np.pi))
    potential_minimizers = np.r_[0, f_cheb.roots(), 2*np.pi]
    return np.min([d(x, p) for x in potential_minimizers])

结果如下:

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 2015-08-01
    • 1970-01-01
    • 2014-03-24
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多