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

时间:2012-03-12 13:03:29

标签: scipy

我开始使用函数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定义了算法的收敛性,但我仍然不明白它们之间有什么区别,我看起来一样,但是如果我删除了其中一个我再次收到警告。

xtolftol的确切区别是什么?在这种情况下应该使用哪种?

我已阅读文档:

  

OtherParameters

     

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

我仍然不明白

2 个答案:

答案 0 :(得分:3)

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

TolFun:函数值的终止容差 TolX:x

上的终止容差

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

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

似乎可以很好地扩展到许多问题,并且是一个很好的起点。您可能会发现,如果需要进行调整,那将是显而易见的。像可怕的收敛时间。数据的适应性差等。希望这会有所帮助。

答案 1 :(得分:3)

我知道这个问题有点旧,但我仍然想指出@ 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])