给定一个二维点p
,我试图计算该点和功能曲线之间的最小距离,即找到曲线上的点,它使我得到最小的距离p
,然后计算该距离。我使用的示例函数是使用scipy.optimize.minimize查找全局最小值
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.使用模拟退火算法动机(或任何其他Metaheuristic)。也许将您的优化调用限制为非常低的迭代次数,获取解决方案并让SA决定是否接受此解决方案。再次优化5.使用不同的优化算法(随机选择或并行或竞争)。 6.尝试像ipopt,bonmin,couenne(最后一个是全球求解器) – sascha