在scipy的least_squares函数中使用Levenberg-Marquardt方法

时间:2018-05-28 06:22:41

标签: python optimization scipy nonlinear-optimization

我正在尝试使用Python中的scipy.optimize.least_squares函数来解决(非线性最小二乘)玩具问题。

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 个答案:

答案 0 :(得分:2)

如果您更喜欢指数表示法,则需要写max_nfev=1000000max_nfev=int(1e6)

1e9是一个浮点文字,但max_nfev应该是一个整数。显然,LM算法会对此进行检查,而其他算法可能会默默地接受浮动。

注意数据类型之间的区别:

1是一个值为1的整数,1.0是一个值为1的浮点数。在数学上,两者都具有相同的值,但它们不同,因为它们具有不同的数据类型。