python – 在scipy上寻求与optimize.fmin的融合
我有一个我想用scipy.optimize.fmin最小化的函数.请注意,我在评估函数时强制打印.
我的问题是,当我开始最小化时,打印的值会减小,直到达到某个点(值46700222.800).在那里它通过非常小的咬合继续减少,例如,46700222.797,46700222.765,46700222.745,46700222.699,46700222.688,46700222.678 我的问题是:当函数求值达到一个不再真正进化的值时,如何强制我的算法接受参数的值(比方说,迭代后我的收益不会超过1).我读到可以使用选项ftol,但它对我的代码完全没有影响.事实上,我甚至不知道为ftol提供什么价值.我尝试了从0.00001到10000的所有内容,但仍然没有收敛. 解决方法
实际上没有必要看到你的代码来解释发生了什么.我会一点一点地回答你.
请注意,最后2个值之间的差异是-0.009999997913837433,即大约1e-2.在最小化算法的约定中,您所谓的值通常标记为x.如果在第n次迭代的同一时间遵守这两个条件,则算法停止: > x上的收敛:x [n]与下一次迭代x [n 1]之差的绝对值小于xtol 此外,如果达到最大迭代次数,算法也会停止. 现在请注意,xtol默认值为1e-4,比您的案例中显示的值1e-2小约100倍.然后算法不会停止,因为xtol上的第一个条件没有得到遵守,直到达到最大迭代次数.
这有助于你尊重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(比如说),并且捕获有关已超出最大功能评估数的错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |