我使用有限内存的BFGS优化器来最小化黑盒函数的值。我随机模拟了许多输入参数组合,并意识到ftol
和gtol
参数只是挡路,它对降低我的函数值没有任何帮助( ftol
和gtol
的输出和随机输入之间存在正相关,所以越小越好)。因此,我将两者都设置为1E-18
,并将重点放在配置其他参数上,因此退出消息CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH
意味着,我猜整个优化依赖于eps
的正确值。
然后,我将ftol
和gtol
都设置为1E-20
,使其不会成为障碍,但随后我开始获得次优结果。
所以我的优化器是:
scipy.optimize.minimize(function, x0=guess.flatten(), method='L-BFGS-B', bounds=bounds, options={ 'maxcor': maxcor, 'ftol': 1E-20, 'gtol': 1E-20, 'eps': eps, 'maxfun': maxrounds, 'maxiter': maxrounds, 'maxls': maxls})
因此,我将其设置为1E-20
,并随机提供其他值。对于更大的样本,1E-20
的平均输出比1E-18
小,我不明白为什么,他们应该是非常小的数字,可以忽略不计。我也开始收到像CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL
这样的退出消息,我不知道这么小的容忍度是怎么可能的。因此,我有以下问题:
1)是否值得将ftol
和gtol
设置为像1E-20
这样低的值?
2)如果已经设置了ftol
和gtol
,我应该设置tol
(外部公差值)吗?我不希望它提前退出。或者,如果启用了gtol
和ftol
,是否会禁用tol
作为退出阈值?
3)有没有可能Scipy、Numpy或Python3本身不能处理20位小数的浮点值?我注意到Python主要打印浮点数的18位数字,所以问题可能是我放了太多的数字。如果是,那么scipy.optimize处理的最大位数是多少?(Scipy v1.4.1 | Numpy v1.18.1 | Python 3.5.3)
发布于 2020-02-08 16:46:33
由于四舍五入误差,您正在设置的公差不是真正可以实现的。您可以阅读here中有关Python浮点精度的更多信息。您应该为gtol和ftol选择一个较小但合理的数字,通常为1e-6 - 1e-8。
https://stackoverflow.com/questions/60059564
复制相似问题