5

只有在使用非常大或非常小的数字时,是否有人遇到过 fmin_slsqp(或 scipy.optimize 中的其他任何内容)的问题?

我正在编写一些python代码来获取灰度图像和蒙版,生成直方图,然后将多个高斯拟合到直方图。为了开发代码,我使用了一个小示例图像,经过一些工作,代码运行良好。但是,当我首先对直方图进行归一化,生成 bin 值 <<1,或者当我对巨大的图像进行直方图,生成数十万个 bin 值时,fmin_slsqp() 开始偶尔失败。它仅在大约 5 次迭代后退出,通常只返回我给出的初始猜测的略微修改版本,并返回退出模式 8,这意味着“线搜索的正方向导数”。如果我在开始时检查 bin 计数的大小并将它们缩放到 ~100-1000 的附近,fmin_slsqp() 将照常工作。我只是在返回结果之前取消缩放。

我环顾四周,发现人们在谈论 epsilon 值,它基本上是用于逼近导数的 dx,但调整并没有帮助。除此之外,我还没有发现任何有用的东西。任何想法将不胜感激。提前致谢。

詹姆士

4

3 回答 3

5

我有类似的问题optimize.leastsq。我需要处理的数据通常非常小,例如 1e-18 等,我注意到在这些情况下,leastsq 不会收敛到最佳拟合参数。只有当我将数据缩放到更常见的东西(比如数百、数千等,你可以用整数保持分辨率和动态范围的东西)时,我才能让 minimumsq 收敛到非常合理的东西。

我一直在尝试使用这些可选的容差参数,这样我就不必在优化之前缩放数据,但运气不佳......

有谁知道一个很好的通用方法来避免 scipy.optimize 包中的函数出现这个问题?我很感激你能分享......我认为根源与OP的问题相同。

于 2011-12-06T02:35:20.273 回答
4

当您的基础数据发生显着变化时,您是否正在更新您的初始猜测(“x0”)?对于任何迭代线性优化问题,如果您最初的猜测与您尝试拟合的数据相去甚远,就会出现这些问题。这更像是一个优化问题,而不是一个 scipy 问题。

于 2011-04-17T02:00:10.343 回答
1

我也遇到了这个问题,但我在我的项目中解决了它。我不确定这是否是通用解决方案。

原因是当参数设置或默认设置scipy.optimize.fmin_slsqp时,通过近似方法计算梯度。从近似方法产生的梯度没有标准化(大规模)。在计算步长时,较大的梯度值会影响线搜索的性能和精度。这可能是我们得到.jacFalsePositive directional derivative for linesearch

您可以尝试将雅可比矩阵的封闭形式实现到对象函数并将其传递给jac参数。更重要的是,您应该重新调整雅可比矩阵的值(如归一化)以避免影响线搜索。

最好的。

于 2015-12-01T13:23:22.373 回答