2012-09-03 7 views
2

J'ai un tableau numx 3x2000 dans x_data et un tableau numpy 1x2000 dans y_data que je passe à cette fonction pour me donner une ligne de régression. ça fonctionne bien. Le problème est que j'essaie de faire quelques backtesting et de tester 1000 situations, je dois régresser 1000 fois et il me faudra environ 5 minutes pour cela.Python fmin trop lent

J'ai essayé d'uniformiser les variables, cela ne semblait pas le rendre plus rapide.

J'ai aussi brièvement essayé fmin_powell et fmin_bfgs qui semblaient le casser.

des idées? Merci!

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

faites attention lorsque vous ajoutez et enregistrez min à ce moment-là? –

+0

Cinq minutes ne doivent pas être longues; c'est vraiment relatif (et juste le temps qu'il faut pour prendre une tasse de café). En outre, vous définissez xtol un facteur 10 inférieur; Cela peut ralentir les choses. Et que signifie «briser» dans ce contexte? Depuis je suppose que ceux-ci peuvent être légèrement plus rapides. – Evert

+0

Joran, pourriez-vous m'expliquer ce que vous voulez dire? grâce – appleLover

Répondre

2

Utilisez numexpr pour rendre votre Hyp et cost_hyp computatation d'évaluer plus rapidement. La famille de fonctions fmin calcule ces fonctions plusieurs fois pour différentes entrées. Donc, tout gain à ces fonctions est directement signalé dans la minimisation.

Ainsi, par exemple, vous devez remplacer:

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

par:

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

numexpr est censé fonctionner avec tableau numpy.

+0

Nicolas, je me suis penché là-dessus mais je ne suis pas sûr de savoir comment je peut utiliser numexpr ici. Je vois deux problèmes. Le premier numexpr semble être pour l'arithmétique simple, donc je ne suis pas sûr de savoir comment je peux l'utiliser ici avec cette algèbre linéaire et faire une multiplication matricielle. Deuxièmement, je ne suis pas sûr de ce que vous entendez par "attachez votre hyp et cost_hyp", je suis un peu nouveau sur ces sujets, donc si vous pouviez s'il vous plaît me donner quelques mots d'explication. Merci! – appleLover

+0

Voir la réponse corrigée, s'il vous plaît. –