我有一个我想用scipy.optimize.fmin最小化的函数.请注意,我在评估函数时强制打印.
我的问题是,当我开始最小化时,打印的值会减小,直到达到某个点(值46700222.800).在那里它通过非常小的咬合继续减少,例如,46700222.797,46700222.765,46700222.745,46700222.699,46700222.688,46700222.678
直觉上,我觉得我已经达到了最小值,因为每一步的长度都是负1.然后算法一直运行,直到我得到“已超过最大功能评估数”错误.
我的问题是:当函数求值达到一个不再真正进化的值时,如何强制我的算法接受参数的值(比方说,迭代后我的收益不会超过1).我读到可以使用选项ftol,但它对我的代码完全没有影响.事实上,我甚至不知道为ftol提供什么价值.我尝试了从0.00001到10000的所有内容,但仍然没有收敛.
最佳答案 实际上没有必要看到你的代码来解释发生了什么.我会一点一点地回答你.
My problem is, when I start the minimization, the value printed decreases
untill it reaches a certain point (the value 46700222.800). There it
continues to decrease by very small bites, e.g.,
46700222.797,46700222.765,46700222.745,46700222.699,46700222.688,46700222.678
请注意,最后2个值之间的差异是-0.009999997913837433,即大约1e-2.在最小化算法的约定中,您所谓的值通常标记为x.如果在第n次迭代的同一时间遵守这两个条件,则算法停止:
> x上的收敛:x [n]与下一次迭代x [n 1]之差的绝对值小于xtol
> f(x)上的收敛:f [n]和f [n 1]之间的差的绝对值小于ftol.
此外,如果达到最大迭代次数,算法也会停止.
现在请注意,xtol默认值为1e-4,比您的案例中显示的值1e-2小约100倍.然后算法不会停止,因为xtol上的第一个条件没有得到遵守,直到达到最大迭代次数.
I read that the options ftol could be used but it has absolutely no
effect on my code. In fact, I don’t even know what value to put for
ftol. I tried everything from 0.00001 to 10000 and there is still no
convergence.
这有助于你尊重ftol的第二个条件,但是从来没有达到第一个条件.
为了达到你的目标,也增加xtol.
在调试优化例程的收敛时,以下方法也将对您有所帮助.
>在要最小化的函数内部,在返回之前打印x的值和f(x)的值.然后运行优化例程.从这些打印中,您可以确定xtol和ftol的合理值.
>考虑对问题进行无量纲化.如果ftol和xtol默认为1e-4,则有一个原因.他们希望你制定问题,使x和f(x)的顺序为O(1)或O(10),比如介于-100和100之间的数字.如果你执行无量纲化,你会处理一个更简单的问题,在你经常知道什么样的价值以及你所追求的容忍度的方式.
>如果您只是粗略计算并且无法估计xtol和ftol的典型值,并且您知道(或者您希望)您的问题表现良好,即它会收敛,您可以尝试运行fmin阻止,仅传递给fmin maxiter = 20(比如说),并且捕获有关已超出最大功能评估数的错误.