【问题标题】:Problem with scipy.optimize.fmin_slsqp when using very large or very small numbers使用非常大或非常小的数字时 scipy.optimize.fmin_slsqp 的问题
【发布时间】:2011-02-17 00:27:17
【问题描述】:
只有在使用非常大或非常小的数字时,是否有人遇到过 fmin_slsqp(或 scipy.optimize 中的任何其他内容)的问题?
我正在编写一些 python 代码来获取灰度图像和蒙版,生成直方图,然后将多个高斯拟合到直方图。为了开发代码,我使用了一个小示例图像,经过一些工作,代码运行良好。但是,当我首先对直方图进行归一化,生成 bin 值
我环顾四周,发现人们在谈论 epsilon 值,它基本上是用于逼近导数的 dx,但调整并没有帮助。除此之外,我还没有发现任何有用的东西。任何想法将不胜感激。提前致谢。
詹姆斯
【问题讨论】:
标签:
python
scipy
histogram
gaussian
least-squares
【解决方案1】:
我也遇到过类似的问题 optimize.leastsq。我需要处理的数据通常非常小,例如 1e-18 等,我注意到在这些情况下,leastsq 不会收敛到最佳拟合参数。只有当我将数据缩放到更常见的东西(比如数百、数千等,可以用整数保持分辨率和动态范围的东西)时,我才能让 minimumsq 收敛到非常合理的东西。
我一直在尝试使用这些可选的容差参数,这样我就不必在优化之前缩放数据,但运气不佳...
有没有人知道一个很好的通用方法来避免 scipy.optimize 包中的函数出现这个问题?我很感激你能分享......我认为根源与 OP 的问题相同。
【解决方案2】:
当您的基础数据发生显着变化时,您是否正在更新您的初始猜测(“x0”)?对于任何迭代线性优化问题,如果您最初的猜测与您尝试拟合的数据相去甚远,就会出现这些问题。这更像是一个优化问题,而不是一个 scipy 问题。
【解决方案3】:
我也遇到了这个问题,但我在我的项目中解决了它。我不确定这是否是通用解决方案。
原因是当jac 参数设置为False 或默认值时,scipy.optimize.fmin_slsqp 通过近似方法计算梯度。从近似方法产生的梯度没有标准化(大规模)。在计算步长时,较大的梯度值会影响线搜索的性能和精度。这可能是我们得到Positive directional derivative for linesearch的原因。
您可以尝试将雅可比矩阵的封闭形式实现到对象函数并将其传递给jac 参数。更重要的是,您应该重新调整雅可比矩阵的值(如归一化)以避免影响线搜索。
最好的。