2012-09-03 90 views
2

我在x_data中有一个3x2000的numpy数组,在y_data中有一个1x2000的numpy数组,我通过这个函数回归给我一个回归线。它工作正常。问题是我正在尝试做一些回测试,并且测试1000次我不得不倒退1000次,并且需要大约5分钟来运行。Python fmin太慢

我试图标准化变量,它似乎没有让它变得更快。

我还简要地尝试了fmin_powell和fmin_bfgs,它似乎打破了它。

有什么想法?谢谢!

def regress(x_data, y_data, fg_spread, fg_line): 

    theta = np.matrix(np.ones((1,x_data.shape[0]))*.11) 
    hyp = lambda theta, x: 1/(1 + np.exp(-(theta*x))) 
    cost_hyp = lambda theta, x, y: ((np.multiply(-y,np.log10(hyp(theta,x)))) - \ 
          (np.multiply((1-y),(np.log10(1-hyp(theta, x)))))).sum() 

    theta = scipy.optimize.fmin(cost_hyp, theta, args=(x_data,y_data), xtol=.00001, disp=0) 

    return hyp(np.matrix(theta),np.matrix([1,fg_spread, fg_line]).reshape(3,1)) 
+0

注意添加并保存分钟在那一点上? –

+0

五分钟不一定很长;这真的是相对的(只是你需要喝杯咖啡的时间)。另外,您将xtol设置为低10倍;这可能会减慢速度。在这种情况下,“打破它”是什么意思?因为我猜这些可能会稍微快一点。 – Evert

+0

乔兰,你能解释一下你的意思吗?感谢 – appleLover

回答

2

使用numexpr,让您的HYP和cost_hyp computatation评估更快。 fmin系列函数为不同条目计算这些函数多次。因此,这些功能的任何收益都直接报告在最小化。

因此,例如,你将取代:

hyp = lambda theta, x: 1/(1 + np.exp(-(theta*x))) 

由:

hyp = lambda theta, x: numexpr.evaluate("1/(1 + exp(-(theta*x)))") 

Numexpr是指具有numpy的阵列工作。

+0

Nicolas,我看着这个,但我不确定我可以在这里使用numexpr。我看到两个问题。第一个数学似乎是简单的算术,所以我不知道我怎么能用这个线性代数来做矩阵乘法?第二,我不确定你的意思是“扣紧你的hyp和cost_hyp”,我对这些话题很陌生,所以如果你能给我多一点解释的话。谢谢! – appleLover

+0

请参阅固定答案。 –