scipy.leastsq和scipy.least_squares之间的区别

Seb*_*991 9 python optimization numpy scipy least-squares

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

当我实现它们时,它们在chi ^ 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以扩展或指出我可以找到替代文档的地方,scipy中的那个有点神秘.

Pra*_*een 5

从文档中least_squares可以看出,这leastsq是一个较旧的包装器.

也可以看看

leastsq   Levenberg-Marquadt算法的MINPACK实现的传统包装器.

所以你应该使用least_squares.它似乎least_squares有额外的功能.其中最重要的是使用的默认"方法"(即算法)是不同的:

  • trf:Trust Region反射算法,特别适用于带边界的大型稀疏问题.一般稳健的方法.
  • dogbox:具有矩形信任区域的dogleg算法,典型用例是边界小问题.不建议用于排名不足的雅可比行列式问题.
  • lm:在MINPACK中实现的Levenberg-Marquardt算法.不处理边界和稀疏的雅可比人.对于小的无约束问题,通常是最有效的方法.

默认是trf.有关更多信息,请参阅Notes.

leastsq算法只是该lm方法的一个包装器,正如文档所说 - 只适用于小的无约束问题.

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