xtol和ftol使用scipy.optimize的fmin()有什么区别



我开始在一个非常简单的例子中使用函数fmin,并尝试获取值​​使其乘积值最小化的向量:

def prueba(x,y):
    print "valor1:",x[0],"n"
    print "valor2:",x[1],"n"
    print "valor3:",x[2],"n"
    print "valor4:",x[3],"n"
    min=x[0]*x[1]*x[2]*x[3]
    print min
    return min
sal = fmin(prueba,x0=array([1, 2, 3,4]),args="1",retall=1,xtol=0.5,ftol=0.5)#maxfun=1,maxiter=1,retall=1,args="1")

但如果我不定义xtol,ftol就会出现:

"Warning: Maximum number of function evaluations has been exceeded."

出于这个原因,我已经使用参数xtolftol定义了算法的收敛性,但我仍然不明白它们之间的区别,我看起来是一样的,但如果我删除了其中一个,我会再次收到警告。

CCD_ 3和CCD_?,在这种情况下应该使用哪个?。

我已经阅读了文档:

其他参数

xtol:number
xopt中用于收敛的可接受的相对误差
ftol:number
func(xopt)收敛的可接受相对误差。

我仍然不理解

以下是我的理解。它类似于mathworks函数fminsearch。他们定义了这些值:

TolFun:函数值的终止公差TolX:x 上的终止公差

随着搜索以迭代方式进行。x的值在一次迭代和另一次迭代之间的差异越来越小,直到它不再重要,你也可以这样做。功能公差也是如此。在您的示例中,对prueba进行求值,并且它在迭代与迭代之间的返回值之间的差异越来越小,直到它也无关紧要为止。你问你应该用哪个。这可能有点像一种实验性的方法。在过去我经常使用:

xtol = 1e-6;
ftol = 1e-6;

它似乎能很好地解决许多问题,是一个很好的起点。你可能会发现,如果一个需要调整,那将是显而易见的。就像可怕的趋同时代。数据拟合度差等。希望这能有所帮助。

我知道这个问题有点老了,但我仍然想指出@user1264127的例子根本不收敛。根据fmin算法的具体细节,该示例可能呈指数发散。如果你想看看xtol和ftol之间的区别,可以尝试一个收敛的例子,比如:

def myFun(x):
    return (x[0]-1.2)**2 + (x[1]+3.7)**2
optimize.fmin(myFun,[0,0])

使用默认参数运行时的输出:

Optimization terminated successfully.
     Current function value: 0.000000
     Iterations: 79
     Function evaluations: 150
Out[4]: array([ 1.19997121, -3.70003115])

当我使用xtol=1e-12:运行时的输出

Optimization terminated successfully.
     Current function value: 0.000000
     Iterations: 138
     Function evaluations: 263
Out[5]: array([ 1.2, -3.7])

当xtol=1时,ftol=1e-3:

Optimization terminated successfully.
     Current function value: 0.000099
     Iterations: 61
     Function evaluations: 116
Out[17]: array([ 1.20348989, -3.69068928])

最新更新