python - 如何在 scipy.optimize 函数上强制执行更大的步骤?

标签 python optimization numpy scipy gaussian

我有一个函数 compare_images(k, a, b) 比较两个二维数组 ab

在函数内部,我将 sigma=kgaussian_filter 应用到 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 应用高斯滤波器并带有一点半随机噪声。
  • 我们通过对 A 应用具有常量 sigma 的高斯滤波器来逼近 B。此 sigma 是通过视觉选择的,但仅适用于特定类别的图像。
  • 我试图为每个图像获得一个最佳的 sigma,所以稍后我可以找到 sigma 和每个图像中显示的事件类别的一些关系。

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

最佳答案

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

如果 gaussian_filter 的行为如您所说,则您的函数是分段常数,这意味着依赖导数的优化器(即它们中的大多数)已经过时了。您可以尝试像 anneal 这样的全局优化器,或在 k 的合理范围内进行暴力搜索。

但是,正如您所描述的问题,如果 ba< 的平滑版本,通常只会有一个清晰的全局最小 compare_images/。如果您想确定使两个图像最相似的 a 的平滑量,您的方法是有意义的。

如果问题是“这些图像有多相似”,那么我认为逐像素比较(可能有一点平滑)是可行的方法。根据我们谈论的图像,可能需要先对齐图像(例如,为了比较照片)。请澄清:-)

编辑:另一个可能有帮助的想法:重写 compare_images 以便它计算两个版本的 smoothed-a -- 一个带有 sigma=floor(k) 和一个带有 ceil(k) 的(即轮 k 到下一个较低/较高的 int)。然后计算a_smooth = a_floor*(1-kfrac)+a_ceil*kfrac,其中kfrack的小数部分。这样,比较函数就变成连续的 w.r.t k

祝你好运!

关于python - 如何在 scipy.optimize 函数上强制执行更大的步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478949/

相关文章:

从多个列表创建 Python Numpy 数组

python - 从在线打开图像,保存到服务器 Flask

python - IDLE 子进程启动错误

php - 用于评级系统的高效 MySQL 表结构

android - 性能:Android JCIFS 文件读取速度慢

python - numpy.polyfit vs numpy.polynomial.polynomial.polyfit

python - 已安装 Html 测试运行程序,但显示错误 "ModuleNotFoundError: No module named ' HtmlTestRunner' "

python - 在 dask 数组上并行化 numpy arange

c - 优化/减少 For 循环

python - 取消列出 np.linspace 的结果