You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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逻辑:

  1. 关闭内置polish开关,先跑完全局差分进化搜索,拿到全局阶段输出的最优候选解
  2. 手动调用独立的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 00:06:05