【发布时间】: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 函数正在寻找局部最小值(给定一些初步猜测),但不是全局最小值,这导致了不连续性。我知道找到任何函数的全局最小值是不可能的,但我正在寻找一种更可靠的方法来找到全局最小值。
寻找全局最小值的可能方法是
- 选择一个聪明的初始猜测,但这相当于大致知道全局最小值从哪里开始,即使用问题的解决方案来解决它。
- 使用多个初始猜测并选择得到最佳最小值的答案。然而,这似乎是一个糟糕的选择,尤其是当我的函数变得更复杂(和更高维度)时。
- 找到最小值,然后扰乱解决方案并再次找到最小值,希望我可能已经将它敲到了一个更好的最小值。我希望也许有一些方法可以简单地做到这一点,而不会引起一些复杂的 MCMC 算法或类似的东西。这个过程的速度很重要。
任何有关解决此问题的最佳方法的建议,或可能解决此问题的有用功能的方向都会很棒!
【问题讨论】:
-
4.使用模拟退火激励算法(或任何其他元启发式算法)。也许将您的优化调用限制为非常低的迭代,获取解决方案并让 SA 决定是否接受此解决方案。再次优化 5. 使用不同的优化算法(随机选择或并行或竞争)。 6. 尝试 ipopt、bonmin、couenne 之类的重的东西(最后一个是全局求解器)
标签: python algorithm scipy minimize