Question

Je connais certaines fonctions de scipy.optimize.optimize et j'ai déjà utilisé fmin_cg pour minimiser une fonction dont je connaissais la dérivée.Cependant, j'ai maintenant une formule qui n'est pas facile à différencier.

Plusieurs fonctions de ce module (fmin_cg, par exemple) ne nécessitent pas réellement la fourniture du dérivé.Je suppose qu'ils calculent ensuite une quazi-dérivée en ajoutant tour à tour une petite valeur à chacun des paramètres - est-ce correct ?

Ma question principale est la suivante :Laquelle des fonctions (ou une d'ailleurs) est la meilleure à utiliser lors de la minimisation d'une fonction sur plusieurs paramètres sans dérivée donnée ?

Était-ce utile?

La solution

Oui, j'appelle l'un des fmin_bfgs fmin_cg fmin_powell comme

fmin_xx( func, x0, fprime=None, epsilon=.001 ... )

estime le gradient à x par (func( x + epsilon I ) - func(x)) / epsilon.
Ce qui est "le meilleur" pour votre application, cependant, dépend fortement de la façon dont votre fonction est fluide et du nombre de variables.
Plaine Nelder-Mead, fmin, est un bon premier choix – lent mais sûr ;malheureusement, le scipy Nelder-Mead commence avec un simplexe de taille fixe, .05 / .00025 quelle que soit l'échelle de x.

J'ai entendu dire que fmin_tnc dans scipy.optimize.tnc est bon:

fmin_tnc( func, x0, approx_grad=True, epsilon=.001 ... )  or
fmin_tnc( func_and_grad, x0 ... )  # func, your own estimated gradient

(fmin_tnc est ~ fmin_ncg avec des contraintes liées, de jolis messages pour voir ce qui se passe, des arguments quelque peu différents.)

Autres conseils

Je ne connais pas très bien ce qui est disponible dans SciPy, mais le Descente Simplex La méthode (alias Nelder-Mead ou méthode Amoeba) fonctionne souvent bien pour l'optimisation multidimensionnelle.

En regardant maintenant le documentation scipy, il semble qu'il soit disponible en option dans le minimize() fonction à l'aide de la method='Nelder-Mead' argument.

Ne le confondez pas avec l'algorithme Simplex (Dantzig) pour la programmation linéaire...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top