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

问题描述:

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

我正在研究一些Python代码,以获取灰度图像和蒙版,生成直方图,然后将多个高斯拟合为直方图。为了开发代码,我使用了一个小样本图像,经过一番努力,代码工作得非常出色。但是,当我首先规格化直方图时,生成二进制值< < 1,或者当我对巨大图像进行直方图生成时,会生成数十万个bin值,fmin_slsqp()会偶尔出现故障。它仅在〜5次迭代后退出,通常只是返回我给出的初始猜测的稍微修改后的版本,并返回退出模式8,这意味着“linesearch的正方向导数”。如果我在开始时检查垃圾箱的大小,并将它们缩放到〜100-1000附近,fmin_slsqp()将照常工作。我只是在返回结果之前对其进行缩放。我想我可以像这样离开它,但感觉像是一个黑客。

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

詹姆斯

是否要更新您的初始猜测(“X0”)时,基础数据的变化而急剧扩大?对于任何迭代线性优化问题,如果您的初始猜测远离您尝试适合的数据,则会发生这些问题。这是一个比scipy问题更多的优化问题。

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

我一直在试图与周围那些可选的容参数,使我没有优化之前,大规模的数据,但还没有与它多少运气...

有谁知道一个优秀的将军方法来避免scipy.optimize包中的函数出现此问题?我希望你能分享......我认为根源与OP的问题是一致的。

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

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

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

最好。