我开始使用函数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."
出于这个原因,我已经使用参数xtol
和ftol
定义了算法的收敛性,但我仍然不明白它们之间有什么区别,我看起来一样,但是如果我删除了其中一个我再次收到警告。
xtol
和ftol
的确切区别是什么?在这种情况下应该使用哪种?
我已阅读文档:
OtherParameters
xtol:数字
xopt中可接受的相对误差用于收敛 ftol:号码 func(xopt)中可接受的相对误差用于收敛。
我仍然不明白
答案 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])