我有一个函数compare_images(k, a, b)
,它比较两个二维数组a
和b
在函数内部,我将带有gaussian_filter
的sigma=k
应用于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个小时左右的时间来运行我的所有数据,但是我不需要再做一次。
无论如何,要为仍然有兴趣寻找更好解决方案的人们更好地解释问题:
A
和B
,其中包含一些科学数据。 A
看起来像几个带有可变值的点(它是一个矩阵,其中每个值的点代表事件发生的位置及其强度)B
看起来像一个平滑的热图(它是观察到的出现密度)B
看起来就像您对A
应用了高斯滤波器,并带有一些半随机噪声。 B
应用常量sigma
的高斯滤波器来近似A
。此sigma
是从视觉上选择的,但仅适用于特定类别的图像。 sigma
,因此以后我可以找到sigma
和每个图像中显示的事件类别的某些关系。 无论如何,谢谢您的帮助!
最佳答案
快速检查:您可能真的是fmin(compare_images, init_guess, (a,b))
吗?
如果gaussian_filter
的行为如您所说,则您的函数是分段常量的,这意味着依赖于导数的优化器(即大多数优化器)就退出了。您可以尝试使用像anneal这样的全局优化器,也可以在合理的k
范围内进行蛮力搜索。
但是,正如您所描述的那样,如果compare_images
是b
的平滑版本,那么通常只有一个清晰的a
全局最小值。如果要确定使两个图像最相似的a
的平滑程度,则您的方法很有意义。
如果问题是“图像有多相似”,那么我认为应该进行逐像素比较(也许要进行一些平滑处理)。根据我们正在谈论的图像,可能需要首先对齐图像(例如,用于比较照片)。请说清楚 :-)
edit :另一个可能有用的想法:重写compare_images,以便计算出两个平滑的a
版本-一个使用sigma = floor(k)
,另一个使用ceil(k)
(即,将k舍入到下一个较低/较高的int)。然后计算a_smooth = a_floor*(1-kfrac)+a_ceil*kfrac
,kfrac
是k
的小数部分。这样,比较函数就变成连续的w.r.t k
。
祝你好运!