我在Octave / Matlab中有一些代码执行L-BFGS优化,其调用签名如下:
[optTheta, cost] = fminlbfgs(objFunc, theta);
其中objFunc
是我的目标函数,theta
是我对参数的初步猜测。我认为fminlbfgs
是一个库,但它的调用签名和行为类似于Matlab中的minFunc
。 objFunc
返回[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
的模块运行时间最长。
答案 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)