【问题标题】:what is the difference between xtol and ftol to use fmin() of scipy.optimize?xtol 和 ftol 使用 scipy.optimize 的 fmin() 有什么区别?
【发布时间】:2013-04-26 05:04:26
【问题描述】:

我开始用一个非常简单的例子来使用函数 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 到底有什么区别?在这种情况下应该使用哪个?

我已阅读文档:

其他参数

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

还是不明白

【问题讨论】:

    标签: scipy


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢。因此,可以仅指示一次迭代和另一次迭代(ftol)之间接受的最小误差来确定收敛,而不是定义 xtol 的可接受误差而保留此默认值? fmin(prueba,x0=array([1, 2, 3,4]),args="1",retall=1,ftol=0.00001)
    • 是的,这可能会解决您的问题。如果它解决了您的问题,请不要忘记点击接受此答案! :-)
    • 非常感谢。问题是,如果指出: fmin (test, x0 = array ([1, 2, 3.4]), args = "1", retall = 1, ftol = 0.6, xtol = 0.6) 解决方案是: 383 优化成功终止. 384 当前函数值:0.016163 385 迭代:23 386 函数评估:42。但仅表示 fmin (test, x0 = array ([1, 2, 3.4]), args = "1", retall = 1, ftol = 0.6)出现警告,为什么?
    • ftolxtol的默认值为0.0001,当你在搜索过程中设置ftol小于xtol时,xtol在到达ftol之前被超过所以它提前终止。我应该仔细看看你的问题,原谅。我建议始终设置两者。
    • 非常感谢,我又感到难过。我想我理解你的推理,但是当我只定义 ftol = 0.6 时,ftol 比默认的 xtol 设置为 0.0001 大,所以在这种情况下,ftol 将在 xtol 之前完成,我没有看到任何问题,但出现了警告。谢谢!!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多