scipy.optimize.minimize 中是否需要 ftol 和 gtol 给它一个很低的值是否合适?
Is ftol and gtol needed in scipy.optimize.minimize is it proper to give it a very low value?
我正在使用有限内存 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)
由于舍入误差,您设置的公差实际上无法实现。您可以在 Python 中阅读 here 更多关于浮点精度的信息。您应该为 gtol 和 ftol 选择一个小但合理的数字,通常 1e-6 - 1e-8 有效。
我正在使用有限内存 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)
由于舍入误差,您设置的公差实际上无法实现。您可以在 Python 中阅读 here 更多关于浮点精度的信息。您应该为 gtol 和 ftol 选择一个小但合理的数字,通常 1e-6 - 1e-8 有效。