python - 在 scipy 的最小二乘函数中使用 Levenberg-Marquardt 方法
问题描述
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
?我没有关于这个问题的任何进一步信息,例如雅可比矩阵,所以我不确定这种方法是否特别适合这个问题。
解决方案
您需要编写max_nfev=1000000
,或者max_nfev=int(1e6)
如果您更喜欢指数表示法。
1e9
是浮点文字,但max_nfev
应该是整数。显然,LM 算法会检查这一点,而其他算法可能会默默地接受浮点数。
注意值和数据类型之间的区别:
1
是一个值为 1 的整数,1.0
是一个值为 1 的浮点数。从数学上讲,两者具有相同的值,但它们不是同一事物,因为它们具有不同的数据类型。
推荐阅读
- django - Django TemplateDoesNotExist 错误不断显示,文件不在 `django/contrib/admin/templates/` 目录中
- javascript - JavaScript,组合数组中的匹配元素
- python - 熊猫中的多值或多索引数据透视表
- python - 从 .py 创建 exe 文件
- graphql - Graphql:从类型中读取 SDL 指令
- javascript - 如何使用多个值动态构造 ajax 有效负载
- javascript - Javascript 中的闭包和作用域
- java - 实现 Runnable 的类中的 Thread 字段,该类实例化所述类
- algorithm - 如何将 n 个元素的任意组合 m 次相加得到结果的所有可能方式
- javascript - window.onload 在用户导航时不会触发,但在刷新页面时会触发