2011-02-17 3 views
5

Est-ce que quelqu'un a déjà rencontré des problèmes avec fmin_slsqp (ou quoi que ce soit d'autre dans scipy.optimize) seulement en utilisant des nombres très grands ou très petits?Problème avec scipy.optimize.fmin_slsqp lors de l'utilisation de très grands ou très petits nombres

Je travaille sur un code python pour prendre une image en niveaux de gris et un masque, générer un histogramme, puis ajuster plusieurs gaussiennes à l'histogramme. Pour développer le code, j'ai utilisé une petite image, et après un certain travail, le code fonctionnait avec brio. Cependant, lorsque je normalise l'histogramme en premier, en générant des valeurs bin < < 1, ou quand j'analyser des images énormes, générant des valeurs de poubelle dans des centaines de milliers, fmin_slsqp() commence à échouer sporadiquement. Il quitte après seulement ~ 5 itérations, retournant juste une version légèrement modifiée de la conjecture initiale que je lui ai donnée, et renvoie le mode de sortie 8, qui signifie "Dérivé directionnel positif pour linesearch". Si je vérifie la taille du bin au début et l'échelle dans le voisinage de ~ 100-1000, fmin_slsqp() fonctionne comme d'habitude. Je ne fais que mettre à l'échelle les choses avant de retourner les résultats. Je suppose que je pourrais le laisser comme ça, mais c'est comme un hack. J'ai regardé autour de moi et j'ai trouvé des gens qui parlaient de la valeur d'epsilon, qui est essentiellement le dx utilisé pour l'approximation des dérivées, mais l'ajustement n'a pas aidé. A part ça, je n'ai rien trouvé d'utile pour le moment. Toutes les idées seraient grandement appréciées. Merci d'avance.

James

Répondre

4

Souhaitez-vous mettre votre estimation initiale (« x0 ») lorsque vos modifications de données sous-jacentes échelle de façon spectaculaire? Pour tout problème d'optimisation linéaire itératif, ces problèmes se produiront si votre estimation initiale est loin des données que vous essayez d'ajuster. C'est plus un problème d'optimisation qu'un problème scipy.

5

J'ai eu des problèmes similaires optimiser.leastsq. Les données que j'ai besoin de traiter sont souvent très petites, comme 1e-18 et autres, et j'ai remarqué que leastsq ne converge pas vers les meilleurs paramètres dans ces cas-là. Ce n'est que lorsque je redimensionne les données à quelque chose de plus commun (comme dans des centaines, des milliers, etc., quelque chose que vous pouvez maintenir la résolution et la gamme dynamique avec des entiers), je peux laisser leastsq converger vers quelque chose de très raisonnable.

J'ai essayé autour avec ces paramètres de tolérance en option pour que je n'ai pas à l'échelle des données avant d'optimiser, mais n'ont pas eu beaucoup de chance avec elle ...

Est-ce que quelqu'un connait un bon général approche pour éviter ce problème avec les fonctions dans le paquet scipy.optimize? J'apprécierais que vous pourriez partager ... Je pense que la racine est le même problème avec les PO.

1

J'ai eu des problèmes avec ce problème aussi, mais je l'ai résolu dans mon projet. Je ne suis pas sûr si c'est une solution générale.

La raison était que le scipy.optimize.fmin_slsqp a calculé le gradient par une approche approximative lorsque l'argument jac est défini par False ou par défaut. Le gradient produit à partir de l'approche approximative n'était pas normalisé (à grande échelle). Lors du calcul de la longueur du pas, une grande valeur de gradient influencerait la performance et la précision de la recherche de ligne. Cela pourrait être la raison pour laquelle nous avons obtenu Positive directional derivative for linesearch.

Vous pouvez essayer d'implémenter la forme fermée de la matrice jacobienne dans la fonction objet et la passer à l'argument jac. Plus important encore, vous devriez redimensionner la valeur de la matrice jacobienne (comme la normalisation) pour éviter d'affecter la recherche de ligne.

Meilleur.

Questions connexes