我正在运行嵌套优化代码。
sp.optimize.minimize(fun=A, x0=D, method="SLSQP", bounds=(E), constraints=({'type':'eq','fun':constrains}), options={'disp': True, 'maxiter':100, 'ftol':1e-05})
sp.optimize.minimize(fun=B, x0=C, method="Nelder-Mead", options={'disp': True})
第一个最小化是函数B的一部分,所以它是在第二个最小化中运行的。
整个优化过程是基于数据的,没有随机数。
我在两台不同的计算机上运行完全相同的代码,得到完全不同的结果。
我安装了不同版本的anaconda,但是
scipy,numpy,所有使用的包都有相同的版本。
我真的不认为操作系统会有关系,但一个是windows 10(64位),另一个是windows 8.1(64位)
我在想是什么导致了这个。
尽管我没有陈述所有选项,但如果两台计算机运行相同的代码,结果不应该是相同的吗?
或者sp.optimize是否有任何选项可以将默认值设置为因计算机而异?
PS.我在看选项“eps”。有没有可能“eps”的默认值在这些电脑上是不同的?
2条答案
按热度按时间uubf1zoe1#
您永远不应该期望数值方法在不同的设备上执行相同的操作;或者甚至是在同一设备上运行同一代码的不同运行。由于机器的有限精度,您永远无法计算“真实的”结果,而只能计算数值近似值。在长时间的优化任务中,这些差异可以累加。
此外,一些优化方法在内部使用某种随机性来解决陷入局部最小值的问题:它们将小的、几乎为零的噪声添加到先前计算的解中,以允许算法更快地收敛于全局最小值,而不会停留在局部最小值或鞍点。
你能试着画出你想最小化的函数的版图吗?这可以帮助你分析问题:如果两个结果(在每台机器上)都是局部最小值,那么这种行为可以用我前面的描述来解释。
如果不是这样,您应该检查两台机器上安装的
scipy
的版本。也许您在一台设备上隐式使用float
值,而在另一台设备上也使用double
值?你看:有很多可能的解释这种(乍一看)奇怪的数字行为;你必须给予我们更多的细节来解决这个问题。
46qrfjad2#
我发现不同版本的SciPy允许或不允许最小和最大边界相同,例如,在SciPy 1.5.4版本中,一个最小和最大边界相等的参数将该项的雅可比矩阵发送给nan,这将使最小化过早停止。