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

Scipy L-BFGS-B优化遇评估次数超限问题及相关问询

Scipy L-BFGS-B优化问题排查与参数调整

我使用Scipy的minimize函数结合L-BFGS-B方法优化目标函数,编写的代码如下:

result = minimize(fun = res_fit_obj_f, 
                          x0 = input_params_initial_guess, 
                          args = (all_fitted_windows_df, 
                                  ...
                                  debug), 
                          method = method, 
                          bounds = input_params_bounds,
                          options = options
                          )
        
# Check if the optimization was successful
if result.success:
    success = True
    xopt = result.x
    fopt = result.fun
    benefit = result.fun - ig_obj_f_val
    rel_benefit = np.round(benefit / ig_obj_f_val * 100 , 2)
else:
    success = False
    # Print an error message if the optimization was not successful
    print('Warning!')
    print('SCIPY Minimization Error (used method =',method,') failed.  Error message:', result.message)

部分场景下出现错误提示:STOP: TOTAL NO. of f AND g EVALUATIONS EXCEEDS LIMIT.

此前已对Scipy L-BFGS-B的options参数进行调优:

hps['options'] = {
    'maxiter': 1000000,
    'disp' : hps['debug'], # to display convergence messages
    'maxls': 200,
    'ftol': 1e-10,
    'gtol': 1e-10,
}

从计算时长判断,求解器应该未达到1000000次迭代,因此该错误提示不符合预期,现咨询两个问题:

  1. 如何查看此次优化的迭代历史?
  2. 如何增加允许的函数评估次数,让优化器有更多时间/算力以获得更精确的解?

问题1:查看优化迭代历史

有两种可行方法:

  • 使用callback回调函数:在minimize调用中添加callback参数,自定义函数记录每次迭代的关键信息(迭代次数、目标函数值、参数等)。示例代码:
# 初始化列表存储迭代历史
iteration_history = []

def record_history(xk):
    # 计算当前参数对应的目标函数值
    f_val = res_fit_obj_f(xk, all_fitted_windows_df, ..., debug)
    iteration_history.append({
        'iteration': len(iteration_history) + 1,
        'params': xk.copy(),
        'fun_value': f_val
    })

# 在minimize中加入callback参数
result = minimize(fun=res_fit_obj_f,
                  x0=input_params_initial_guess,
                  args=(all_fitted_windows_df, ..., debug),
                  method=method,
                  bounds=input_params_bounds,
                  options=options,
                  callback=record_history)

# 打印迭代历史
for entry in iteration_history:
    print(f"迭代 {entry['iteration']}: 目标函数值 = {entry['fun_value']}")
  • 开启disp选项:你已设置disp: hps['debug'],当debug为True时,求解器会在控制台输出每一步的迭代详情,包括函数评估次数、迭代次数等实时信息。

问题2:增加函数评估次数限制

L-BFGS-B中,maxiter控制的是迭代次数上限,而函数评估次数的限制由maxfun参数决定(默认值为15000)。你之前仅设置了maxiter,未调整maxfun,因此即使迭代次数未达1e6,函数评估次数先触发了默认上限,导致错误。

解决方法:在options中添加maxfun参数并设置更大的值,示例:

hps['options'] = {
    'maxiter': 1000000,
    'disp' : hps['debug'],
    'maxls': 200,
    'ftol': 1e-10,
    'gtol': 1e-10,
    'maxfun': 1000000  # 提升函数评估次数上限
}

调整后,求解器可进行更多次的函数和梯度评估,避免提前停止。


内容的提问来源于stack exchange,提问作者twistfire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:53:08