如何(稳健地)在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中的二维数组上找到局部最小值?的主要内容,如果未能解决你的问题,请参考以下文章

C ++在二维数组中查找局部最大值

在 nxn 的二维数组中查找局部最大值

如何相应地用一维数组删除二维数组中的元素

跨多个单元格最有效地搜索二维数字数组

一些Python中的二维数组的操作方法

获取高于某个值的二维数组中的局部最大值坐标