如何(稳健地)在python中的二维数组上找到局部最小值?
Posted
技术标签:
【中文标题】如何(稳健地)在python中的二维数组上找到局部最小值?【英文标题】:How to (robustly) find a local minimum on a 2D array in python? 【发布时间】:2020-03-02 08:48:42 【问题描述】:我有一个二维数组,它代表某个函数 f(x, y) 的值,我想检测数组上的最小值。 通常它只是看起来像这样,所以很容易发现最小值。
Example normal minimum
但有时会有一种漂移,这意味着实际的最小值不是我正在寻找的那个。
Example failed minimum
在上图中,我要查找的最小值在左侧,但图像右侧的值较小。
获得精确到像素的精确值对我来说真的很重要,这就是为什么我不能真正使用最大过滤器或类似的东西。 我正在寻找一种计算有效的方法来检测这个最小值,所以我宁愿使用现有的方法而不是编写自己的代码。
【问题讨论】:
您可以迭代整个事情并简单地为整个阵列做一些 min( tempMin, 1e-8 ),或者如果您真的很酷,那么模拟退火怎么样?随机梯度下降甚至遗传算法。顺便说一句,如果你有这个功能,为什么不解析地解决它呢? 【参考方案1】:要获取二维数组中最小值的索引,我建议如下:
find_smallest = lambda arr: np.unravel_index(np.argmin(arr),arr.shape)
【讨论】:
我喜欢unravel_index
。但这只会给我实际的全局最小值,而不是任何本地最小值。【参考方案2】:
也许您可以尝试scipy.optimize
中的一些求解器(例如Nelder-Mead)。这些将寻找局部最小值。
然后,为了获得您正在寻找的最小值,您可以尝试从不同的随机点启动多个优化,并丢弃最终接近图像边界的解决方案。也就是说,假设您的最小值在远离边界的某个地方。这是一种丑陋的方法,可能效率不高,但我有点希望它可以工作。此外,您可能还需要调整参数。
否则,gradient 函数可能会带来一些魔力。我想你必须寻找一些周围都有正导数的点。
【讨论】:
以上是关于如何(稳健地)在python中的二维数组上找到局部最小值?的主要内容,如果未能解决你的问题,请参考以下文章