我正在运行嵌套优化代码。
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”的默认值是否可能不同?
答案 0 :(得分:0)
你永远不要指望数值方法在不同的设备上执行相同的操作;或者甚至在同一设备上运行相同代码。由于机器的精度有限,您无法计算“实际”结果,只能计算数值近似值。在长时间的优化任务中,这些差异可以归结起来。
此外,一些优化方法在内部使用某种随机性来解决陷入局部最小值的问题:它们为先前计算的解决方案添加了一个小的,消失的噪声,以允许算法在全局中更快地收敛最小值,不要陷入局部最小值或鞍点。
您可以尝试绘制想要最小化的功能的横向吗?这可以帮助您分析问题:如果两个结果(在每台机器上)都是局部最小值,那么这种行为可以通过我之前的描述来解释。
如果不是这种情况,则应检查两台计算机上已安装的scipy
版本。也许你隐含地在一台设备上使用float
值,在另一台设备上使用double
值?
你看:对于这个(初看起来)奇怪的数字行为有很多可能的解释;你必须给我们更多细节来解决这个问题。