寻求与scipy上的optimize.fmin融合

swe*_*eet 3 python optimization scipy

我有一个我想要最小化的功能scipy.optimize.fmin.请注意,我print在评估函数时强制执行.

我的问题是,当我开始最小化时,打印的值会减小,直到达到某个点(值46700222.800).在那里它继续减少非常小的比例,例如,46700222.797,46700222.765,46700222.745,46700222.699,46700222.688,46700222.678因此直观地说,我觉得我已经达到了最小值,因为每一步的长度都减去了1.但算法一直在运行直到我得到一个" Maximum number of function evaluations has been exceeded"错误.

我的问题是:当函数求值达到一个不再真正进化的值时,我怎么能强制我的算法接受参数的值(比方说,迭代后我的收益不超过1).我读过ftol可以使用这些选项,但它对我的代码完全没有影响.事实上,我甚至不知道要付出什么价值ftol.我尝试了从0.00001到10000的所有内容,但仍然没有收敛.

gg3*_*349 6

实际上没有必要看到你的代码来解释发生了什么.我会一点一点地回答你.

我的问题是,当我开始最小化时,打印的值会减小,直到达到某个点(值46700222.800).在那里它继续减少非常小的比例,例如,46700222.797,46700222.765,46700222.745,46700222.699,46700222.688,46700222.678

请注意,最后2个值之间的差异是-0.009999997913837433,即约1e-2.在最小化算法的约定中,通常标记您所谓的值x.如果在第n-d次迭代时同时遵守这两个条件,则算法停止:

  • 收敛于x:x[n]下一次迭代之间的差值的绝对值x[n+1]小于xtol
  • 收敛于f(x):f[n]和之间的差值的绝对值f[n+1]小于ftol.

此外,如果达到最大迭代次数,算法也会停止.

现在请注意,xtol默认值的值1e-4大约100小于1e-2为您的案例显示的值.然后算法不会停止,因为第一个条件xtol不会被遵守,直到它达到最大迭代次数.

我读到可以使用选项ftol,但它对我的代码完全没有影响.事实上,我甚至不知道为ftol提供什么价值.我尝试了从0.00001到10000的所有内容,但仍然没有收敛.

这有助于你尊重第二个条件ftol,但是从来没有达到第一个条件.

为了达到你的目标,也要增加xtol.

在调试优化例程的收敛时,以下方法也将对您有所帮助.

  • 在要最小化的函数内部x,f(x)在返回之前打印值和值.然后运行优化例程.从这些印刷品中,您可以为xtol和决定合理的价值ftol.
  • 考虑对问题进行无量纲化.有一个原因,如果ftolxtol默认两者1e-4.他们希望你能制定这样的问题x,并f(x)有秩序O(1)或者O(10),说之间的数字-100+100.如果你执行无量纲化,你会遇到一个更简单的问题,就像你经常知道期望什么值以及你所遵循的容差一样.
  • 如果你有兴趣只是一个粗略的计算,不能估计的典型值xtolftol,你知道(或您希望如此),你的问题是很乖的,即它会收敛,你可以运行fmin在一个try块,传递给fminmaxiter=20(说),并抓住有关的错误Maximum number of function evaluations has been exceeded.