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

Scipy.optimize.minimize Nelder-Mead的fatol参数未生效,求排查

Nelder-Mead算法终止条件问题分析与解决方案

核心误解:fatol参数的作用

你对fatol的理解有误:它不是监测连续两次迭代的函数值差值,而是判断单纯形所有顶点的函数值的绝对误差范围。当单纯形中最大函数值与最小函数值的差值小于fatol时,优化才会终止,并非相邻两次迭代的函数值差达标就停止。

你给出的部分输出中,即使某两次迭代的函数值差小于0.001,但只要当前单纯形内仍存在函数值差距超过0.001的顶点,优化就会继续运行。

解决方案:实现“MSE低于指定值即终止”

如果你的需求是当MSE本身低于设定阈值(如0.001)时直接终止优化,Nelder-Mead的默认参数无法直接实现,需要通过callback参数自定义终止逻辑:

步骤1:编写回调函数

def stop_on_low_mse(xk):
    # 计算当前参数对应的MSE
    ref_array = load_ref_arr("folder/reference_array.txt")
    calc_array = calc_new_array(xk)
    current_mse = np.mean((ref_array - calc_array)**2)
    # 当MSE小于阈值时返回True,触发优化终止
    return current_mse < 0.001

步骤2:在优化中引入回调

修改minimize调用代码,添加callback参数:

options = {'maxiter': 100, 'disp': False, 'initial_simplex': init_simplex_arr}

result = minimize(fitness_function, x0, method='Nelder-Mead', bounds=bounds, options=options, callback=stop_on_low_mse)

补充说明

如果坚持使用fatol控制终止,需要明确它的收敛逻辑:只有当整个单纯形的函数值都足够接近(最大最小值差小于fatol)时,优化才会停止。这种情况下你需要观察单纯形所有顶点的函数值,而非仅单次迭代的最优值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:53:29