【问题标题】:difference between scipy.optimize.leastsq and scipy.optimize.least_squares?scipy.optimize.leastsq 和 scipy.optimize.least_squares 之间的区别?
【发布时间】:2023-03-17 13:15:01
【问题描述】:

我一直在使用旧版 scipy.optimize.leastsq 运行优化过程 现在我想切换到scipy.optimize.least_squares(我需要引入边界)。 但是 least_squares 抛出一个我无法调试的错误。在我的代码下面,我对 least_squaresleastsq 所做的完全一样。

import scipy
from scipy.optimize import leastsq, least_squares
print(scipy.__version__)

def residuals_cmrset_as_2009JoH(x0, df):
    k_max= x0[0]
    a= x0[1]
    alpha= x0[2]
    b= x0[3]
    beta= x0[4]
    k_Ei_max= x0[5]
    k_CMI= x0[6]
    C_CMI= x0[7]
    CMI_max= x0[8]
    EVI_min= x0[9]
    EVI_max= x0[10]

    df['aet_cmrset'] = aet_cmrset_as_2009JoH(df.evi, df.gvmi, df.pet, df.rain, 
                            k_max, a, alpha, b, beta, k_Ei_max, k_CMI, C_CMI, CMI_max, EVI_min, EVI_max) 
    return(df.aet_cmrset - df.AET_observed)
    

print('run calibration with leastsq')
x, flag = leastsq(residuals_cmrset_as_2009JoH, 
                  np.transpose(x0), 
                  args=(df_calibration))
print('this is the result from leastsq')
print(x)

print('run calibration with least_squares')
x, flag = least_squares(residuals_cmrset_as_2009JoH, 
                        np.transpose(x0), 
                        args=(df_calibration)) 
print('this is the result from least_squares')
print(x)

这是输出:

1.2.0
run calibration with leastsq
this is the result from leastsq
[ 0.99119625  1.44145154  1.12799561 27.41023799  2.60102797  0.09771226
  1.14979708 -0.24298292  1.          0.          0.9       ]
run calibration with least_squares
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-bc305703822b> in <module>
     30 x, flag = least_squares(residuals_cmrset_as_2009JoH, 
     31                         np.transpose(x0),
---> 32                         args=(df_calibration)) 
     33 print('this is the result from least_squares')
     34 print(x)

/apps/python/3.7.2/lib/python3.7/site-packages/scipy-1.2.0-py3.7-linux-x86_64.egg/scipy/optimize/_lsq/least_squares.py in least_squares(fun, x0, jac, bounds, method, ftol, xtol, gtol, x_scale, loss, f_scale, diff_step, tr_solver, tr_options, jac_sparsity, max_nfev, verbose, args, kwargs)
    796         x0 = make_strictly_feasible(x0, lb, ub)
    797 
--> 798     f0 = fun_wrapped(x0)
    799 
    800     if f0.ndim != 1:

/apps/python/3.7.2/lib/python3.7/site-packages/scipy-1.2.0-py3.7-linux-x86_64.egg/scipy/optimize/_lsq/least_squares.py in fun_wrapped(x)
    791 
    792     def fun_wrapped(x):
--> 793         return np.atleast_1d(fun(x, *args, **kwargs))
    794 
    795     if method == 'trf':

TypeError: residuals_cmrset_as_2009JoH() takes 2 positional arguments but 11 were given

欢迎任何帮助

【问题讨论】:

  • 您仔细比较过文档吗?您使用完全相同的参数调用它们。这是调用规范指定的吗?
  • args 应该是一个元组。逗号是必不可少的。 args=(df_calibration,)

标签: python scipy least-squares scipy-optimize


【解决方案1】:

两个函数都指定args 应该是一个元组。但 leastsq 有,接近开始这个

if not isinstance(args, tuple):
    args = (args,)

我在least_squares 中没有看到相同的内容。该步骤“保护”leastsq,以防用户出错并传递一个数组而不是指定的元组。

【讨论】:

  • 谢谢。尝试重复,这次得到了一个不同的错误:添加了args = (df_calibration,)并传递了args,新的错误消息是:------------------------- -------------------------------------------------- ValueError Traceback (最近一次调用最后一次) ValueError: too many values to unpack (expected 2)
  • 根据文档,leastsq 返回两个对象,您将它们分配给x, flagleast_squares 返回一个对象,OptimizeResult,它是一个有 9 个条目的 dict 子类。 docs.scipy.org/doc/scipy/reference/generated/…
  • 谢谢,现在工作!!
猜你喜欢
  • 2017-05-12
  • 2017-10-12
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
  • 2014-09-20
  • 2010-10-28
  • 2015-10-04
  • 2012-08-12
相关资源
最近更新 更多