与Octave相比,Python中的BFGS优化要慢得多

时间:2014-03-22 23:57:39

标签: matlab scipy octave

我在Octave / Matlab中有一些代码执行L-BFGS优化,其调用签名如下:

[optTheta, cost] = fminlbfgs(objFunc, theta);

其中objFunc是我的目标函数,theta是我对参数的初步猜测。我认为fminlbfgs是一个库,但它的调用签名和行为类似于Matlab中的minFuncobjFunc返回[cost, gradient]。此代码最多可执行400次迭代,并在不到5分钟的时间内完成。

我已将我的代码移植到Python并尝试使用Scipy的minimize进行相同的优化:

res = minimize(obj_func, theta, 
               method='BFGS', jac=True, 
               options={'maxiter': 400, 'disp':True})

但由于某些原因,这段代码运行速度非常慢(我等了大约15分钟才杀死它)。 obj_func的返回签名与Octave中的相同。

我想知道是否我没有正确调用minimize功能?分析显示包含minimize的模块运行时间最长。

1 个答案:

答案 0 :(得分:1)

我无法准确指出您的问题是什么,但您可以看到BFGS最小化是否收敛,

def print_resnorm(x):
    print "residual norm = ", obj_func(x)[0]

res = minimize(obj_func, theta, 
               method='BFGS', jac=True, 
               options={'maxiter': 400, 'disp':True},
               callback=print_resnorm)