scipy差分进化算法自定义L-BFGS-B参数及传参报错解决
报错核心原因
minimizer_kwargs是SciPy 1.1.0版本才新增到differential_evolution接口的入参,本地安装的SciPy版本低于1.1.0时,函数根本没有接收这个参数的入口,自然会抛出你遇到的TypeError。
分场景的正确实现方案
场景1:使用SciPy ≥1.1.0版本
你原本编写的参数传入逻辑本身是符合接口规范的,只要满足版本要求即可正常运行。需要注意两个容易踩的细节:
- 不要漏传
differential_evolution必须指定的参数边界bounds,这个参数缺失也会触发异常 - 参数嵌套结构要和接口要求匹配:L-BFGS-B的
ftol、gtol、eps属于求解器的配置项,需要放在minimizer_kwargs内部的options子字典中
可直接复用的参考实现:
from scipy import optimize as opt # 自定义求解精度、梯度计算步长 ftol = 1e-6 gtol = 1e-5 eps = 1e-8 # 该参数对应L-BFGS-B计算数值梯度的差分步长,可按仿真场景需求调整 res = opt.differential_evolution( run, bounds=你的参数上下界列表, polish=True, minimizer_kwargs={ 'method': 'L-BFGS-B', 'options': {'ftol': ftol, 'gtol': gtol, 'eps': eps} } )
场景2:必须使用SciPy <1.1.0的旧版本
旧版本接口不支持直接传局部优化的配置参数,内置polish流程调用的L-BFGS-B是硬编码默认设置,没有对外暴露配置入口,可以通过手动拆分流程的方式实现自定义局部搜索,完全替代内置的polish逻辑:
- 关闭内置polish开关,先跑完全局差分进化搜索,拿到全局阶段输出的最优候选解
- 手动调用独立的L-BFGS-B求解器,以全局最优解为初始点,传入自定义的精度、步长参数完成精细化优化
参考实现代码:
# 第一步:关闭内置局部搜索,执行全局优化 res_global = opt.differential_evolution( run, bounds=你的参数上下界列表, polish=False ) # 第二步:手动执行带自定义配置的局部精细化优化 res_final = opt.minimize( run, x0=res_global.x, method='L-BFGS-B', bounds=你的参数上下界列表, options={'ftol': ftol, 'gtol': gtol, 'eps': eps} )
补充说明:L-BFGS-B接口中的
eps参数就是用来调整数值梯度计算的差分步长的,传入指定值后会完全覆盖默认步长设置,适配你当前的仿真黑箱函数的评估需求。如果升级版本后传参仍报错,可以检查是否存在参数拼写错误(比如把minimizer_kwargs错写为minimizer_kwards)。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

