当 scipy.optimize.minimize 可能用于相同的事情时,为啥 scipy.optimize.least_squares 存在?
Posted
技术标签:
【中文标题】当 scipy.optimize.minimize 可能用于相同的事情时,为啥 scipy.optimize.least_squares 存在?【英文标题】:Why does scipy.optimize.least_squares exist when scipy.optimize.minimize could potentially be used for the same things?当 scipy.optimize.minimize 可能用于相同的事情时,为什么 scipy.optimize.least_squares 存在? 【发布时间】:2018-08-19 02:08:21 【问题描述】:我试图理解为什么scipy.optimize.least_squares
存在于scipy
中。此功能可用于执行模型拟合。但是,可以使用scipy.optimize.minimize
来做同样的事情。唯一的区别是scipy.optimize.least_squares
在内部计算卡方,而如果要使用scipy.optimize.minimize
,他/她将不得不在用户想要最小化的函数中手动计算卡方。此外,scipy.optimize.least_squares
不能被视为 scipy.optimize.minimize
的包装器,因为它支持的三种方法(trf
、dogbox
、lm
)根本不被 scipy.optimize.minimize
支持。
所以我的问题是:
当scipy.optimize.minimize
可以达到相同的结果时,为什么还存在scipy.optimize.least_squares
?
为什么scipy.optimize.minimize
不支持trf
、dogbox
和lm
方法?
谢谢。
【问题讨论】:
从历史上看,scipy
是一组过于专业化或“先进”而无法适应 numpy
的工具。一旦将工具放入这样的包中,就很难删除(以防有人仍在使用它)。为什么这样的问题只能通过深入研究代码历史、github 问题和开发者讨论(以及前 github 时代的历史片段)来回答。
但是,查看least_squares
文档,我发现它是不久前在 0.17 中新增的。所以可能有很多关于它的讨论。例如:github.com/scipy/scipy/issues/5020 和 github.com/scipy/scipy/pull/5019
您也可以使用minimize
来求解线性规划的实例,但这很愚蠢(与使用 LP 求解器相比;更专业)。对于一个非常常见的问题,它只是一个更专业的功能。为什么要在这里使用minimize
(哪个确切的问题,哪个求解器以及哪种 jac/hess 计算)? (在某些情况下 l-bfgs-b 可能会变得有趣)
方便。最小二乘法非常常见,① 有一个名为 least_squares
的方法很方便,② 有一个 开箱即用 专门用于常见任务的方法很方便(我的意思是,没有关键字参数,没有考虑......瞄准,开火,BOOM)
【参考方案1】:
scipy.optimize.least_squares 中的算法利用最小化问题的最小二乘结构来更好地收敛(或使用的导数的低阶)。
类似于高斯-牛顿算法和牛顿法的区别,见Wikipedia或this question。
特别是,Gauss-Newton 仅使用 Jacobian(一阶导数),而 Newton 方法还使用 Hessian(二阶导数),计算成本很高。
【讨论】:
以上是关于当 scipy.optimize.minimize 可能用于相同的事情时,为啥 scipy.optimize.least_squares 存在?的主要内容,如果未能解决你的问题,请参考以下文章
使用 scipy.optimize.minimize 提前停止损失函数
`scipy.optimize.minimize` 中的 Jacobian 和 Hessian 输入
scipy.optimize.minimize 选择无视约束的参数
为啥 scipy.optimize.minimize (默认)在不使用 Skyfield 的情况下报告成功?