Python ajustement de la courbe de bibliothèque qui me permet d'assigner des limites pour les paramètres
J'aimerais être capable d'effectuer des ajustements qui me permet d'ajuster une courbe arbitraire fonction des données, et me permet de fixer arbitrairement les limites sur les paramètres, par exemple: je veux ajustement de la fonction:
f(x) = a1(x-a2)^a3\cdot\exp(-\a4*x^a5)
et de dire:
a2
est dans la plage suivante:(-1, 1)
a3
eta5
sont positifs
Il est agréable scipy curve_fit fonction, mais il ne permet pas de spécifier le paramètre de limite. Il est aussi agréable http://code.google.com/p/pyminuit/ bibliothèque qui ne générique minimalization, et qu'elle permet de fixer des limites sur les paramètres, mais dans mon cas, il n'a pas coverge.
Voici une question similaire, avec quelques réponses utiles: stackoverflow.com/questions/22895794/...
OriginalL'auteur jb. | 2013-05-26
Vous devez vous connecter pour publier un commentaire.
Remarque: la Nouvelle version de 0,17 SciPy
Supposons que vous souhaitez pour s'adapter à un modèle de données qui ressemble à ceci:
et avec la contrainte sur alpha
tandis que d'autres paramètres a et b reste libre. Ensuite, il faut utiliser les bornes de l'option de curve_fit de la manière suivante:
Source est ici.
Puis-je définir le paramètre alpha gamme que le nombre entier d'intervalles au lieu de flotter? Exemple α = { 0, 1, 2, 3, 4, 5, ... }
OriginalL'auteur Mohit Pandey
Solution de contournement: utiliser la variable transformations comme a2=tanh(a2), a3=exp(a3') ou a5=a5'^2.
OriginalL'auteur Joachim W
Comme déjà mentionné par Rob Falck, vous pouvez utiliser, par exemple, la scipy d'optimisation non linéaire des routines dans scipy.minimiser pour réduire l'arbitraire de la fonction d'erreur, par exemple, l'erreur quadratique moyenne.
Notez que la fonction que vous avez donné n'est pas nécessairement vraies valeurs - c'était peut être la raison de votre minimisation dans pyminuit ne converge pas. Vous avez à traiter un peu plus explicite, voir l'exemple 2.
Les exemples ci-dessous utilisent tous les deux la
L-BFGS-B
la minimisation de la méthode, qui prend en charge délimitée paramètre régions. J'ai divisé cette réponse en deux parties:1. Véritable arrivée
L'exemple ci-dessous montre l'optimisation de cette version légèrement modifiée de votre fonction.
2. Extension du complexe arrivée
Extension de la au-dessus de la minimisation de la domaine complexe qui peut être fait explicitement la conversion des nombres complexes et l'adaptation de la fonction d'erreur:
Tout d'abord, vous exprimées explicitement la valeur de x à valeurs complexes f pour assurer des rendements des valeurs complexes et peuvent calculer exposant fractionnaire des nombres négatifs. Deuxièmement, nous calculons l'erreur de la fonction à la fois réel et imaginaire - un simple candidat est la moyenne du carré de la complexe absolus.
Notes
Il semble que le minimiseur peut-être un peu sensible aux valeurs initiales - j'ai donc passé ma première hypothèse (p_init) pas trop loin de l'optimum. Devriez-vous avoir à lutter avec cela, vous pouvez utiliser la même procédure de minimisation en plus d'une optimisation globale de la boucle, par exemple bassin de saut ou brute.
OriginalL'auteur flinz
Vous pouvez utiliser lmfit pour ce genre de problèmes. Donc, j'ajoute un exemple (avec une autre fonction que vous utiliser, mais il peut facilement l'adapter) sur la façon de l'utiliser au cas où quelqu'un est intéressé par ce sujet, trop.
Disons que vous avez un jeu de données comme suit:
et que vous souhaitez adapter un modèle de données qui ressemble à ceci:
avec les contraintes que
À l'aide de
lmfit
(version 0.8.3) vous avez alors obtenir le résultat suivant:Comme vous pouvez le voir, l'ajustement reproduit les données très bien et les paramètres sont dans l'demandé plages.
Ici est l'ensemble du code qui reproduit l'intrigue avec quelques commentaires supplémentaires:
EDIT:
Si vous utilisez la version 0.9.x vous avez besoin de modifier le code en conséquence; vérifier ici dont les changements ont été faits à partir de 0.8.3 à 0,9.x.
OriginalL'auteur Cleb
Avez-vous envisagé de le traiter comme un problème d'optimisation et d'aide de l'une des routines d'optimisation non linéaire dans scipy pour minimiser la méthode des moindres carrés de l'erreur en faisant varier les coefficients de votre fonction? De nombreuses routines d'en optimiser permettre lié à des contraintes sur les variables indépendantes.
OriginalL'auteur Rob Falck