scipy.optimize.minimize Nelder-Mead 'fatol'什么都不做,我做错了什么?

fiei3ece  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(131)

我在一个适应度函数上运行Nelder-Mead优化。该函数返回两个数组之间差异的均方误差(MSE)。
我希望当MSE低于指定值时停止优化。
我的优化设置如下:

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

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

字符串
适应度函数总结如下:

def fitness_function(x):

  # Arrays
  ref_array = load_ref_arr("folder/reference_array.txt"
  calc_array = calc_new_array(x)

  # Calculate MSE
  mse = np.mean((ref_array-calc_array)**2)
  return mse


fitness_function的输出示例:

0.0010713476460687801
0.0002628635483247014
0.0009798654399516093
0.00024260671159317867
0.00099163708787692
0.00017078416043779879
0.0010094022276385295
0.00023695061737201775
0.0005606370238849049
0.00019916645596727386
0.0004211745861734694
0.00020850874852816853
0.0004442950360513234
0.0001982226314876404
0.00038448272667955606
0.00018130359654993492
0.000321567089210017
0.00015139776932472033
0.0002222159416127054
0.0003240715869791624
0.00015971480682450465
0.00031676015901488597
0.00016306956422549413
0.0003316191108649874
0.00015673514985682063
0.0001818140712213015
0.00021525980930940775
0.00015543062242850684
0.00024112123987462002
0.00015026391998004834
0.0002119574083483072
0.00015300530091189144
0.0002051062480492777
0.0001415150195302095
0.00021263582928948626
0.00014027617152343477
0.000178745382624011


根据我的理解,当fatol=0.001时,如果f(n)和f(n-1)之间的差值小于0.001,优化应该终止并且不继续。例如,请参见列表中的输出2和3:

abs(0.0002628635483247014 - 0.0009798654399516093) = 0.0007169 < 0.001


它继续运行,我想让它停止。
任何关于这种行为的帮助都将不胜感激,谢谢。

w8rqjzmb

w8rqjzmb1#

while (fcalls[0] < maxfun and iterations < maxiter):
    if (numpy.max(numpy.ravel(numpy.abs(sim[1:] - sim[0]))) <= xatol and
            numpy.max(numpy.abs(fsim[0] - fsim[1:])) <= fatol):
        break

字符串
这段代码从https://github.com/scipy/scipy/blob/c0dc7fccc53d8a8569cde5d55673fca284bca191/scipy/optimize/optimize.py中提取,用于minimize Nelder Mead,表明基于fatol的停止条件在一个逻辑中,并使用xatol进行表达式。因此,将xatol与fatol一起研究是很好的。这可能解释了为什么收敛在达到fatol要求时没有停止。

相关问题