我使用scipy来最小化某些功能但遇到了一个奇怪的问题。问题是如果我使用相同的目标函数和初始点多次运行scipy.optimize.fmin_bfgs,它每次都会返回不同的结果。
这是我的代码:
# objective function (a bit long, I know)
>>> def obj_fun(x):
... x1, x2, x3, y1, y2, y3 = x[0], x[1], x[2], x[3], x[4], x[5]
... return -(x1 * (y2 - y3) + x2 * (y1 - y3) + x3 * (y1 - y2)) ** 2.0 + 10240.0 * ((x1 ** 2.0 + 2.0 * x1 * y1 + 3.0
* y1 ** 2.0 - 1.0) ** 2.0 + (x2 ** 2.0 + 3.0 * x2 * y2 + 2.0 * y2 ** 2.0 - 3.0) ** 2.0 + (x3 ** 2.0 + 1.3 * x3 * y3 + 4.
0 * y3 ** 2.0 - 7.0) ** 2.0)
我如何致电fmin_bfgs
:
>>> fmin_bfgs(obj_fun, np.array([0,1,2,3,4,5,6]))
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: -234096226752563985252352.000000
Iterations: 342
Function evaluations: 4596
Gradient evaluations: 475
array([ -6.96051555e+04, -3.83874412e+06, 5.37631361e+04,
3.48506449e+04, 3.83874414e+06, -1.94246588e+04,
6.00000000e+00])
>>> fmin_bfgs(obj_fun, np.array([0,1,2,3,4,5,6]))
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: -22936558246668045123584.000000
Iterations: 553
Function evaluations: 7218
Gradient evaluations: 747
array([ -3.91291135e+04, -2.14765204e+06, 3.03606753e+04,
1.95065952e+04, 2.14765197e+06, -1.08606776e+04,
6.00000000e+00])
请注意,我使用完全相同的目标函数和初始点调用fmin_bfgs
,但它只是返回不同的结果。
这可能是什么?我怎样才能达到预期的行为?
我刚刚在一台带有AMD A10-5750M
处理器的计算机上测试过相同的代码,它确实有效!我也在Intel Core2 Duo U9400
计算机上测试了它并没有!我自己的电脑有Intel Core i3-2330M
,当然它不起作用。
3台计算机在Windows 8.1上运行,安装了相同版本的python,numpy和scipy(分别为2.7,1.7.1和0.11.0)。
我不知道这是否重要,但我已经疯了。