2016-11-24 557 views
7

我想知道两种方法scipy.optimize.leastsqscipy.optimize.least_squares之间的区别是什么?scipy.leastsq和scipy.least_squares之间的区别

当我实现了他们,他们产生的志^ 2的细微差别:

>>> solution0 = ((p0.fun).reshape(100,100)) 
>>> # p0.fun are the residuals of my fit function np.ravel'ed as returned by least_squares 
>>> print(np.sum(np.square(solution0))) 
0.542899505806 

>>> solution1 = np.square((median-solution1)) 
>>> # solution1 is the solution found by least_sq, it does not yield residuals thus I have to subtract it from the median to get the residuals (my special case) 
>>> print(np.sum((solution1))) 
0.54402852325 

任何人可以就此展开或指出在哪里可以找到替代的文件,从SciPy的一个有点神秘。

回答

5

从文档的least_squares不提供,它会出现leastsq是一个更老的包装。

leastsq  请参阅MINPACK实施文伯格 - Marquadt算法的传统包装。

所以你应该只使用least_squares。看起来least_squares具有附加功能。其中最重要的是,使用的默认“方法”(即算法)是不同的:

  • trf:信赖域反射算法,特别适合于大型稀疏问题界限。一般健壮的方法。
  • dogbox:带矩形信赖域的dogleg算法,典型用例是带边界的小问题。不建议问题 与秩亏缺的雅可比矩阵。
  • lm:在MINPACK中实现的Levenberg-Marquardt算法。不处理边界和稀疏雅可比矩阵。对于小型无约束问题,通常最有效的方法是 。

默认为trf。有关更多信息,请参阅Notes。

leastsq算法是只为lm方法,它—作为文档说—只适用于小无约束的问题很好的包装。

您在结果中看到的差异可能是由于所采用算法的不同所致。

2

least_squares你可以给上下边界为每个变量

有一些更多的功能,leastsq如果你比较文档字符串

2

关键原因用于编写新的Scipy函数least_squares允许变量的上下界(也称为“框约束”)。这是一个高度要求的功能。

这显然简单的加法实际上是远离琐碎和需要完全新的算法,特别是狗腿(method="dogleg"least_squares)和信赖域反射(method="trf"),其允许的框约束的健壮和有效的处理(详细关于算法在相关的Scipy documentation的参考文献中给出)。

同样重要的是对大规模问题和稀疏雅可比矩阵的支持。

当不需要对变量的界限,这个问题不是非常大,在新SciPy的功能least_squares算法几乎没有,如果有的话,优势就在老leastsq使用列文伯格 - 马夸特MINPACK实施一。

但是,非常相同的MINPACK Fortran代码由旧的leastsq和新的least_squares以及选项method="lm"调用。出于这个原因,旧的leastsq现已过时,不推荐用于新代码。

相关问题