代码之家  ›  专栏  ›  技术社区  ›  Medulla Oblongata

在Scipy最小二乘函数中使用Levenberg-Marquardt方法

  •  1
  • Medulla Oblongata  · 技术社区  · 6 年前

    我正试图用 scipy.optimize.least_squares python中的函数。

    import numpy as np
    from scipy.optimize import least_squares
    
    a = 2
    b = -1
    
    def myfun(x,a,b):
        return [a*x[0]-x[1]-np.exp(-x[0]), b*x[0]+2*x[1]-np.exp(-x[1])]
    
    x0 = [-5,-5]
    sol = least_squares(myfun,x0,method='lm',ftol=1e-9,xtol=1e-9, \
                        max_nfev=1e6,args=(a,b))
    
    print(sol)
    
    '''
    method='trf' solution:  x = array([0.56714329,0.56714329])
    '''
    

    如果我使用Levenberg-Marquardt方法 method='lm' 然后我得到一个错误 TypeError: integer argument expected, got float . 是否缺少的输入参数 least_squares ?我没有关于这个问题的任何进一步的信息,例如雅可比矩阵,所以我不确定这个方法是否特别适合这个问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   MB-F    6 年前

    你需要写 max_nfev=1000000 max_nfev=int(1e6) 如果你喜欢指数符号。

    1e9 是浮点文本,但 max_nfev 应该是整数。显然,lm算法会检查这一点,而其他算法可能会静默地接受一个浮点。

    注意两者之间的区别 价值 数据类型 :

    1 是一个值为1的整数, 1.0