use*_*994 8 python optimization numpy gaussian scipy
我有一个compare_images(k, a, b)比较两个2d阵列a和b
在funcion里面,我应用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_imagesifb是 的平滑版本a。如果您想确定a使两个图像最相似的平滑量,您的方法是有意义的。
如果问题是“图像有多相似”,那么我认为像素比较(可能需要一点平滑)是正确的方法。根据我们所讨论的图像,可能需要首先对齐图像(例如,用于比较照片)。请澄清 :-)
编辑:另一个可能有帮助的想法:重写compare_images,以便它计算两个版本的smoothed a---一个带有sigma= floor(k),一个带有ceil(k)(即将k舍入到下一个较低/较高的整数)。然后计算a_smooth = a_floor*(1-kfrac)+a_ceil*kfrac,kfrac为 的小数部分k。这样,比较函数就变得连续了k。
祝你好运!