使用非常大或非常小的数字时scipy.optimize.fmin_slsqp的问题

时间:2011-02-17 00:27:17

标签: python scipy histogram gaussian least-squares

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

我正在研究一些python代码,以获取灰度图像和蒙版,生成直方图,然后将多个高斯拟合到直方图。为了开发代码,我使用了一个小样本图像,经过一些工作后,代码运行得非常出色。然而,当我首先对直方图进行标准化,生成bin值<&lt;&lt; 1时,或者当我对巨大的图像进行直方图编码时,生成数十万的bin值,fmin_slsqp()偶尔会失败。它仅在约5次迭代后退出,通常只返回我给它的初始猜测的略微修改版本,并返回退出模式8,这意味着“linesearch的正方向导数”。如果我在开始时检查bin计数的大小并将它们缩放到~100-1000附近,fmin_slsqp()将照常工作。我只是在返回结果之前取消缩放。我想我可以这样离开,但感觉就像是黑客。

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

詹姆斯

3 个答案:

答案 0 :(得分:5)

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

我一直在尝试使用这些可选的容差参数,以便在优化之前不必缩放数据,但是没有太多运气...

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

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

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

最佳。