首页 > 解决方案 > scipy.optimize.minimize 中是否需要 ftol 和 gtol 是否适合给它一个非常低的值?

问题描述

我正在使用有限内存 BFGS 优化器来最小化黑盒函数的值。我已经随机模拟了许多输入参数组合,并意识到ftolandgtol参数只是在路上,它对降低我的函数的值没有任何贡献(输出和随机输入之间存在正相关ftoland gtol,所以越小越好)。所以我设置1E-18并专注于配置其他参数,因此退出消息CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH意味着整个优化取决于eps我猜的正确值。

然后我将两者都设置ftolgtol1E-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-20with 1E-18,我不明白为什么,它们应该是可以忽略不计的非常小的数字。我也开始收到退出消息CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL,我不知道这么小的公差怎么可能。所以我有以下问题:

1)是否值得设置ftol并设置gtol为如此低的值1E-20

2)如果已经设置,我应该设置(tol外部公差值)吗?我不希望它提前退出。或者,如果启用并且启用,作为退出阈值是否会被禁用?ftolgtoltolgtolftol

3) Scipy、Numpy 或 Python3 本身是否有可能无法处理 20 位小数的浮点值。我注意到 Python 主要为浮点数打印 18 位数字,所以问题可能是我输入了太多数字。如果是这样,那么 scipy.optimize 处理的最大位数是多少?(Scipy v1.4.1 | Numpy v1.18.1 | Python 3.5.3)

标签: python-3.xscipyfloating-pointscipy-optimizescipy-optimize-minimize

解决方案


由于舍入误差,您设置的容差无法真正实现。您可以在此处阅读有关 Python 中浮点精度的更多信息。您应该为 gtol 和 ftol 选择一个小而合理的数字,通常 1e-6 - 1e-8 有效。


推荐阅读