我正在使用'L-BFGS-B'
最小化一些对数可能性,我不希望算法在REL_REDUCTION_OF_F_ <= factr*epsmch
时停止,因此我设置了ftol=0
:
min_log = scipy.optimize.minimize(fun=minus_log_lik, x0=proc_param,
method='L-BFGS-B', bounds=tuple(bounds),
options={'ftol':0,'gtol':1e-06}
但是我总是用
得到一个结果消息:'CONVERGENCE:REL_REDUCTION_OF_F_&lt; = _ FACTR * EPSMCH'
有谁知道为什么?我试图设置ftol为负,但这会产生错误。
答案 0 :(得分:2)
这是设计的。优化算法通过对参数值进行微小变化并测量变化率来工作。 (想想山上的雪橇,你想要找到最陡的斜坡)。因为您正在处理浮点数,所以您可以继续对值进行越来越小的更改。为了防止程序运行,您需要一些标准来完成。 (当你在山脚下时,你指向雪橇的方向并不重要)
ftol
设置函数调用中更改的最小容差,gtol
设置全局容差。当您将其设置为0时,您将告诉例程计算默认容差。当您将其设置为负数时,您要求例程在何时停止
abs(f(x)-f(x+delta)) <= ftol
这不能以负数发生。
尝试使用ftol:1e-6和gtol:1e-6运行。并了解收敛解决方案需要多长时间/多少次迭代。然后尝试1e-7,看看需要多长时间。然后注意获得的最小值变化不大。
选项的典型值是options = {'disp':None,'maxls':20,'iprint': - 1,'gtol':1e-05,'eps':1e-08,'maxiter' :15000,'ftol':2.220446049250313e-09,'maxcor':10,'maxfun':15000})
请参阅https://docs.scipy.org/doc/scipy/reference/optimize.minimize-lbfgsb.html#optimize-minimize-lbfgsb