我有一个函数 compare_images(k, a, b)
比较两个二维数组 a
和 b
在函数内部,我将 sigma=k
的 gaussian_filter
应用到 a
我的想法是估计我必须多少平滑图像a
以使其与图像 b
问题是我的函数 compare_images
只会在 k
变化超过 0.5
时返回不同的值,如果我这样做 fmin (compare_images, init_guess, (a, b)
它通常卡在 init_guess
值上。
我认为问题是 fmin
(和 minimize
)往往从非常小的步骤开始,在我的例子中,这将为 重现完全相同的返回值compare_images
,所以该方法认为它已经找到了最小值。它只会尝试几次。
有没有办法强制 fmin
或 scipy
中的任何其他最小化函数采取更大的步骤?还是有什么方法更适合我的需要?
编辑:
我找到了一个临时解决方案。
首先,按照建议,我使用 xtol=0.5
和更高版本作为 fmin
的参数。
即便如此,我仍然遇到了一些问题,有几次 fmin
会返回 init_guess
。
然后我创建了一个简单的循环,这样如果 fmin == init_guess
,我会生成另一个随机的 init_guess
并再次尝试。
当然,它很慢,但现在我让它运行了。为我的所有数据运行它需要 20 小时左右,但我不需要再做一次。
无论如何,为了更好地为那些仍然有兴趣寻找更好解决方案的人解释问题:
- 我有 2 张图片,
A
和B
,其中包含一些科学数据。 A
看起来像几个具有可变值的点(它是一个矩阵,其中每个值点代表事件发生的位置及其强度)B
看起来像一个平滑的热图(它是观察到的出现密度)B
看起来就像对A
应用高斯滤波器并带有一点半随机噪声。- 我们通过对
A
应用具有常量sigma
的高斯滤波器来逼近B
。此sigma
是通过视觉选择的,但仅适用于特定类别的图像。 - 我试图为每个图像获得一个最佳的
sigma
,所以稍后我可以找到sigma
和每个图像中显示的事件类别的一些关系。
无论如何,感谢您的帮助!
最佳答案
快速检查:您可能真的是指 fmin(compare_images, init_guess, (a,b))
?
如果 gaussian_filter
的行为如您所说,则您的函数是分段常数,这意味着依赖导数的优化器(即它们中的大多数)已经过时了。您可以尝试像 anneal 这样的全局优化器,或在 k
的合理范围内进行暴力搜索。
但是,正如您所描述的问题,如果 b
是 a< 的平滑版本,通常只会有一个清晰的全局最小
。如果您想确定使两个图像最相似的 compare_images
/a
的平滑量,您的方法是有意义的。
如果问题是“这些图像有多相似”,那么我认为逐像素比较(可能有一点平滑)是可行的方法。根据我们谈论的图像,可能需要先对齐图像(例如,为了比较照片)。请澄清:-)
编辑:另一个可能有帮助的想法:重写 compare_images 以便它计算两个版本的 smoothed-a
-- 一个带有 sigma=floor(k)
和一个带有 ceil(k)
的(即轮 k 到下一个较低/较高的 int)。然后计算a_smooth = a_floor*(1-kfrac)+a_ceil*kfrac
,其中kfrac
是k
的小数部分。这样,比较函数就变成连续的 w.r.t k
。
祝你好运!
关于python - 如何在 scipy.optimize 函数上强制执行更大的步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478949/