2017-02-27 1 views
0

J'essaye d'adapter un ensemble de données de vent v=v1,.....,vm en utilisant une distribution de Weibull de mélange de deux composants.Maximiser la sommation multi-paramètres avec python

J'ai trouvé un document qui suggère d'utiliser la méthode du maximum de vraisemblance et en particulier pour maximiser l'équation suivante:

equation to maximize

Omega, a1, a2, b1 et b2 sont les paramètres que je veux changer afin de maximiser la fonction et v=v1,.....,vm est une série de vitesses de vent connues.

J'ai essayé d'utiliser l'algorithme de minimisation SciPy mais sans succès.

Voici ce que j'ai jusqu'à présent:

def minimizer_function(v,omega,a1,b1,a2,b2): 
    return np.reciprocal(np.sum((omega*(a1/b1)*((v/b1)**(a1-1))*(np.exp(-((v/b1)**a1)))+(1-omega)*(a2/b2)*((v/b2)**(a2-1))*(np.exp(-((v/b2)**a2)))))) 

x0 = np.array([0.5,1.0,1.0,1.0,1.0]) 
res = optimization.minimize(minimizer_function, x0, method='nelder-mead',options={'xtol': 1e-8, 'disp': True}) 

Cependant, je continue à obtenir l'erreur suivante:

minimizer_function() missing 5 required positional arguments: 'omega', 'a1', 'b1', 'a2', and 'b2'

Je suis assez sûr que je manque quelque chose.

Répondre

1

Les minimiseurs scipy s'attendent à ce que les variables soient stockées dans un seul tableau unidimensionnel. Dans votre cas, la fonction objectif doit être quelque chose comme minimizer_function(x, v), où x est un tableau de cinq éléments contenant oméga, a1, b1, a2 et b2. Autrement dit, quelque chose comme

def minimizer_function(x, v): 
    omega, a1, b1, a2, b2 = x 
    return np.reciprocal(np.sum((omega*(a1/b1)*((v/b1)**(a1-1))*(np.exp(-((v/b1)**a1)))+(1-omega)*(a2/b2)*((v/b2)**(a2-1))*(np.exp(-((v/b2)**a2)))))) 

L'appel à minimize serait quelque chose comme

x0 = np.array([0.5,1.0,1.0,1.0,1.0]) 
res = optimization.minimize(minimizer_function, x0, args=(v,), method='nelder-mead',options={'xtol': 1e-8, 'disp': True}) 
+0

Salut Warren, merci beaucoup pour regarder dans cela. Il fonctionne maintenant, les valeurs semblent très étranges mais il me manque probablement encore quelque chose – user7630935

+0

Une suggestion sur la façon de maximiser la fonction? Actuellement, je minimise l'inverse de l'abs de la fonction – user7630935