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
相关产品推荐
相关产品推荐

