【问题标题】:Using Levenberg-Marquardt method in scipy's least_squares function在 scipy 的最小二乘函数中使用 Levenberg-Marquardt 方法
【发布时间】:2018-05-28 14:39:20
【问题描述】:

我正在尝试通过在 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 的输入参数?我没有关于该问题的任何进一步信息,例如雅可比矩阵,所以我不确定这个方法是否特别适合这个问题。

【问题讨论】:

    标签: python optimization scipy nonlinear-optimization


    【解决方案1】:

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

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

    注意数据类型的区别:

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

    【讨论】:

    • 谢谢,你是对的。看起来 max_nfev=int(1e6) 是 LM 算法所必需的,但 trfdogbox 将接受 max_nfev=1e6max_nfev=int(1e6)
    猜你喜欢
    • 1970-01-01
    • 2020-02-14
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多