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:查看优化迭代历史
有两种可行方法:
- 使用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
相关产品推荐
相关产品推荐

