如何(稳健)在python中的2D数组上找到局部最小值?

时间:2019-11-05 22:35:30

标签: python numpy scipy minimum

我有一个二维数组,表示某个函数f(x,y)的值,我想检测数组中的最小值。 通常情况就是这样,因此很容易发现最小值。

Example normal minimum

但是有时候会有一种漂移,这意味着实际的最小值不是我要寻找的最小值。

Example failed minimum

在上面的图像中,我正在寻找的最小值在左侧,但是图像的右侧具有较小的值。

获得对像素精确的精确值对我来说真的很重要,这就是为什么我不能真正使用最大滤镜或类似的东西的原因。 我正在寻找一种计算效率高的方法来检测此最小值,因此我宁愿使用现有方法,也不要自己编写代码。

2 个答案:

答案 0 :(得分:0)

要获得2D数组中最小值的索引,我建议如下:

find_smallest = lambda arr: np.unravel_index(np.argmin(arr),arr.shape)

答案 1 :(得分:0)

也许您可以尝试scipy.optimize中的某些求解器(例如Nelder-Mead)。这些将寻找局部最小值。

然后,为了获得所需的最小值,您可以尝试从不同的随机点启动多个优化,并丢弃最终接近图像边界的解决方案。就是说,假设您的下限在边界之外。这是一个丑陋的方法,可能不是很有效,但是我有点希望它能起作用。另外,您可能必须调整参数。

否则,使用gradient函数可以完成一些魔术。我猜您将不得不寻找一些周围都有正导数的点。