我有一个函数compare_images(k, a, b),它比较两个二维数组ab
在函数内部,我将带有gaussian_filtersigma=k应用于a我的想法是估计要平滑图像a使其类似于图像b所必须进行的操作

问题是我的函数compare_images仅在k的变化量超过0.5的情况下才会返回不同的值,并且如果我执行fmin(compare_images, init_guess, (a, b),则通常会卡在init_guess值上。

我相信问题是fmin(和minimize)往往以非常小的步骤开始,在我的情况下,它将为compare_images再现完全相同的返回值,因此该方法认为它已经找到了最小值。它只会尝试几次。

有没有办法迫使fminscipy中的任何其他最小化功能采取更大的步骤?还是有什么方法更适合我的需要?

编辑:
我找到了一个临时解决方案。
首先,按照建议,我使用xtol=0.5及更高版本作为fmin的参数。
即使那样,我仍然有一些问题,几次fmin将返回init_guess
然后,我创建了一个简单的循环,以便如果使用fmin == init_guess,我将生成另一个随机的init_guess,然后重试。

当然,它的运行速度很慢,但是现在我可以运行它了。我需要花20个小时左右的时间来运行我的所有数据,但是我不需要再做一次。

无论如何,要为仍然有兴趣寻找更好解决方案的人们更好地解释问题:

  • 我有2张图像AB,其中包含一些科学数据。
  • A看起来像几个带有可变值的点(它是一个矩阵,其中每个值的点代表事件发生的位置及其强度)
  • B看起来像一个平滑的热图(它是观察到的出现密度)
  • B看起来就像您对A应用了高斯滤波器,并带有一些半随机噪声。
  • 我们通过对B应用常量sigma的高斯滤波器来近似A。此sigma是从视觉上选择的,但仅适用于特定类别的图像。
  • 我正在尝试为每个图像获取最佳的sigma,因此以后我可以找到sigma和每个图像中显示的事件类别的某些关系。

  • 无论如何,谢谢您的帮助!

    最佳答案

    快速检查:您可能真的是fmin(compare_images, init_guess, (a,b))吗?

    如果gaussian_filter的行为如您所说,则您的函数是分段常量的,这意味着依赖于导数的优化器(即大多数优化器)就退出了。您可以尝试使用像anneal这样的全局优化器,也可以在合理的k范围内进行蛮力搜索。

    但是,正如您所描述的那样,如果compare_imagesb的平滑版本,那么通常只有一个清晰的a全局最小值。如果要确定使两个图像最相似的a的平滑程度,则您的方法很有意义。

    如果问题是“图像有多相似”,那么我认为应该进行逐像素比较(也许要进行一些平滑处理)。根据我们正在谈论的图像,可能需要首先对齐图像(例如,用于比较照片)。请说清楚 :-)

    edit :另一个可能有用的想法:重写compare_images,以便计算出两个平滑的a版本-一个使用sigma = floor(k),另一个使用ceil(k)(即,将k舍入到下一个较低/较高的int)。然后计算a_smooth = a_floor*(1-kfrac)+a_ceil*kfrackfrack的小数部分。这样,比较函数就变成连续的w.r.t k

    祝你好运!

    09-27 09:27