2016-11-23 1 views
1

Ich bin derzeit mit der scipy.optimise.minimise (Methode) einen -log Wahrscheinlichkeit Ausdruck zu minimieren:Performing gleichzeitige fits/Minimierung mit scipy.optimise.minimise()

param_array = np.array([ 
      0.5, # beta1 
      0.5 # beta2 
      ]) 

def f(param_array): 

     great_bayesian = -sum(np.log(binomial.pmf(t_g_c, t_g_t, (param_array[0] + historical_t_g_c)/(param_array[0] + param_array[1] + historical_t_g_t)))) 

     return great_bayesian 

beta_opt = optimize.minimize(f,param_array,method='SLSQP', constraints=cons) 

Die Methode funktioniert gut, wenn ich möchten eine einzelne Wahrscheinlichkeit über einen einzelnen Datenrahmen minimieren und ermitteln die besten Schätzungen von beta1 und beta2 korrekt.

Allerdings würde ich gerne mehrere Datenrahmen gleichzeitig anpassen und eine Reihe von insgesamt besten Schätzungen für Beta1 und Beta2 erhalten.

Ich kann nicht sehen, wie das geht, aber ich bin sicher, es muss ein gelöstes Problem sein. Jede Anleitung würde sehr geschätzt werden!

+0

Mit "gleichzeitig" beziehen Sie sich auf Multiprozessing? Oder willst du einfach mehr dfs benutzen? Eine Klarstellung wäre hilfreich. – Leo

+0

Ahh, ich sehe was du jetzt fragst. Antwort kommt auf. – Leo

Antwort

2

Sie können zusätzliche Argumente an die Funktion übergeben, die Sie mit dem Argument "args" minimieren möchten.

Referenz: https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.minimize.html

Für Ihr Beispiel müssten Sie f (...) neu zu definieren, um die Argumente nehmen Sie ändern möchten. Ändern Sie dann den Aufruf von scipy.minimize, um die zusätzlichen Argumente anzugeben, die Sie als Tupel an f (...) übergeben möchten. Die einzige Einschränkung hier ist, dass f (...) definiert werden muss, damit das Array von Parametern, die Sie minimieren, das erste Argument ist.

Hier sind (nicht getestete) Änderungen an Ihrem Code. Ich habe den Argumenten das Präfix "some_" hinzugefügt, um anzuzeigen, dass diese hier geändert werden können.

param_array = np.array([ 
      0.5, # beta1 
      0.5 # beta2 
      ]) 

def f(param_array, team_great_conv, team_great_tot, historical_team_great_conv, historical_team_great_tot): 

     great_bayesian = -sum(np.log(binomial.pmf(team_great_conv, team_great_tot, (param_array[0] + historical_team_great_conv)/(param_array[0] + param_array[1] + historical_team_great_tot)))) 

     return great_bayesian 

beta_opt = optimize.minimize(f, param_array, 
          args=(some_team_great_conv, 
            some_team_great_tot, 
            some_historical_team_great_conv, 
            some_historical_team_great_tot,), 
          method='SLSQP', constraints=cons) 
+0

Danke, @leo ... Ich werde es jetzt umsetzen. Sehr geschätzt! –

+1

Kein Problem, wenn dieser Code Ihr Problem löst, würde ich mich freuen, wenn Sie es als Antwort akzeptieren könnten. – Leo

+0

Natürlich. Kein Problem –

Verwandte Themen