L'obtention de la norme des erreurs sur les paramètres ajustés à l'aide de l'optimiser.leastsq méthode en python
J'ai un ensemble de données (déplacement vs temps), que j'ai monté pour un couple d'équations à l'aide de l'optimiser.leastsq méthode. Je suis maintenant à la recherche pour obtenir des valeurs d'erreur sur les paramètres ajustés. En regardant à travers la documentation de la matrice de sortie est la matrice jacobienne, et je la multiplie par le résidu de la matrice pour obtenir de mes valeurs. Malheureusement, je ne suis pas statisticien, donc je me noie un peu dans la terminologie.
De ce que je comprends tout ce que j'ai est la matrice de covariance qui va avec mon paramètres ajustés, afin que je puisse racine carrée les éléments de la diagonale pour obtenir mon erreur standard sur les paramètres ajustés. J'ai un vague souvenir de la lecture que la matrice de covariance est qu'est-ce que la sortie de l'optimiser.leastsq méthode de toute façon. Est-ce correct? Si non, comment voulez-vous obtenir le résidu de la matrice de multiplier la sortie du Jacobien pour faire mon matrice de covariance?
Toute aide serait grandement appréciée. Je suis très nouveau à python, et donc de m'excuser si la question s'avère être une base.
le raccord code est comme suit:
fitfunc = lambda p, t: p[0]+p[1]*np.log(t-p[2])+ p[3]*t # Target function'
errfunc = lambda p, t, y: (fitfunc(p, t) - y)# Distance to the target function
p0 = [ 1,1,1,1] # Initial guess for the parameters
out = optimize.leastsq(errfunc, p0[:], args=(t, disp,), full_output=1)
La args t et disp est et tableau de temps et displcement valeurs (fondamentalement juste 2 colonnes de données). J'ai importé tous les éléments nécessaires à la tope du code. Les valeurs ajustées et la matrice fournie par la sortie comme suit:
[ 7.53847074e-07 1.84931494e-08 3.25102795e+01 -3.28882437e-11]
[[ 3.29326356e-01 -7.43957919e-02 8.02246944e+07 2.64522183e-04]
[ -7.43957919e-02 1.70872763e-02 -1.76477289e+07 -6.35825520e-05]
[ 8.02246944e+07 -1.76477289e+07 2.51023348e+16 5.87705672e+04]
[ 2.64522183e-04 -6.35825520e-05 5.87705672e+04 2.70249488e-07]]
Je soupçonne que l'ajustement est un peu suspect tout cas pour le moment. Cela sera confirmé quand je peux les erreurs.
- docs.scipy.org/doc/scipy/reference/generated/...
- Pas entièrement sûr de ce que votre demande, peut-être quelques exemples serait utile.
- C'est la principale docs que j'ai été à la recherche sur. Le code que j'ai utilisé a été ajouté à la description ci-dessus
- Je pense avoir trouvé un moyen de contourner cela (quoique un peu des inconvénients en termes de réécriture du code), je chose que le " optimiser.curve_fit' sorties le covarience de la matrice à partir de laquelle vous pouvez obtenir vos erreurs, et il utilise la même régression des moindres carrés méthode comme le " optimiser.leastsq'. Quelqu'un peut-il confirmer que c'est correct?
- Oui, curve_fit renvoie la matrice de covariance pour l'estimation du paramètre (l'incertitude). Si vous souhaitez utiliser leastsq directement, vous pouvez également vérifier la source de curve_fit.
Vous devez vous connecter pour publier un commentaire.
Mis à jour sur 4/6/2016
Obtenir la correction d'erreurs dans les paramètres d'ajustement peut être subtile dans la plupart des cas.
Pensons à côté d'une fonction
y=f(x)
pour lequel vous avez un ensemble de points de données(x_i, y_i, yerr_i)
, oùi
est un indice qui fonctionne sur chacun de vos points de données.Dans la plupart des mesures physiques, l'erreur
yerr_i
systématique de l'incertitude de l'appareil de mesure ou procédure, et il peut donc être considéré comme une constante qui ne dépend pas dei
.Qui côté de la fonction à utiliser, et comment obtenir le paramètre erreurs?
La
optimize.leastsq
méthode renvoie la fraction de la matrice de covariance. En multipliant tous les éléments de cette matrice par la variance résiduelle (c'est à dire la réduction de chi carré) et en prenant la racine carrée des éléments de la diagonale va vous donner une estimation de l'écart-type de l'ajustement des paramètres. J'ai inclus le code pour le faire dans l'une des fonctions ci-dessous.D'autre part, si vous utilisez
optimize.curvefit
, la première partie de la procédure ci-dessus (en multipliant par la réduction de chi carré) est fait pour vous dans les coulisses. Vous devez ensuite prendre la racine carrée de la éléments de la diagonale de la matrice de covariance pour obtenir une estimation de l'écart-type de l'ajustement des paramètres.En outre,
optimize.curvefit
fournit les paramètres facultatifs de traiter plus de cas général, où l'yerr_i
la valeur est différente pour chaque point de données. À partir de la la documentation:Comment puis-je être sûr que mes erreurs sont correctes?
La détermination d'une bonne estimation de l'erreur standard dans les paramètres ajustés est compliquée problème statistique. Les résultats de la matrice de covariance, tel que mis en œuvre par
optimize.curvefit
etoptimize.leastsq
réellement s'appuient sur des hypothèses concernant la distribution de probabilité des erreurs et les interactions entre ces paramètres; les interactions qui peuvent exister, selon les spécificités de votre fonction fitf(x)
.À mon avis, la meilleure façon de traiter compliqué
f(x)
est d'utiliser la méthode "bootstrap", ce qui est décrit dans ce lien.Nous allons voir quelques exemples
Premier, du code réutilisable. Nous allons définir une ligne sinueuse de la fonction et de générer des données avec des erreurs aléatoires. Nous allons générer un jeu de données avec une petite erreur aléatoire.
Maintenant, nous allons adapter la fonction à l'aide des différentes méthodes disponibles:
`optimiser.leastsq`
`optimiser.curve_fit`
`bootstrap`
Observations
Nous avons déjà commencé à voir quelque chose d'intéressant, l'paramètres et d'erreur des estimations pour les trois méthodes de près d'accord. Ce qui est bon!
Maintenant, supposons que nous voulons dire le raccord fonctions que s'il existe quelque incertitude dans nos données, peut-être une systématique de l'incertitude qui pourrait contribuer à une erreur supplémentaire de vingt fois la valeur de
err_stdev
. C'est beaucoup de l'erreur, en fait, si nous simulons des données avec ce genre d'erreur, il devrait ressembler à ceci:Il n'y a certainement aucun espoir que nous pourrions récupérer les paramètres d'ajustement avec ce niveau de bruit.
Pour commencer, nous allons réaliser que
leastsq
ne permet même pas de nous d'entrée de cette nouvelle erreur systématique de l'information. Voyons ce quecurve_fit
n'quand nous le dire au sujet de l'erreur:Whaat?? Cela doit certainement être mauvais!
Ce qui à la fin de l'histoire, mais récemment
curve_fit
ajouté leabsolute_sigma
paramètre facultatif:Qui est un peu mieux, mais toujours un peu louche.
curve_fit
pense que l'on peut obtenir un ajustement de ce signal bruyant, avec un niveau de 10% d'erreur dans lep1
paramètre. Voyons ce quebootstrap
est-à-dire:Ah, c'est peut-être une meilleure estimation de l'erreur dans notre ajustement de paramètre.
bootstrap
pense qu'il saitp1
avec environ 34% de l'incertitude.Résumé
optimize.leastsq
etoptimize.curvefit
nous offrent un moyen d'estimer les erreurs dans les paramètres ajustés, mais nous ne pouvons pas utiliser ces méthodes sans les remettre en question un petit peu. Lebootstrap
est une méthode statistique qui utilise la force brute, et à mon avis, il a tendance à travailler mieux dans des situations qui peuvent être difficiles à interpréter.Je recommande fortement la recherche à un problème particulier, et en essayant
curvefit
etbootstrap
. Si elles sont similaires, alorscurvefit
est beaucoup moins cher à calculer, donc probablement la peine de l'utiliser. Si elles diffèrent de manière significative, alors que mon argent serait sur lebootstrap
.Y
reposant sur les erreurs (ou résidus) vous le faire 100 fois, l'obtention des paramètres d'ajustement à chaque étapes. Vous pouvez alors prendre le MST comme l'erreur? Comment est-il par rapport à statsmodels' PRIX?sigma
paramètre facultatif dans l'ajustement de la courbe, et de passer un tableau qui a les erreurs pour chacun de vos y points de données.TypeError: func() takes exactly 4 arguments (2 given)
pointant à la ligne oùerrfunc = lambda p, x, y: function(x,p) - y
. Comment le résoudre?a * numpy.exp(-c*x)+d
. Est-ce le problème?p0
argument enfit_bootstrap
est semblable au tableau. Donc, votre fonction doit être définie comme:def fit_function(x, p): p[0] * numpy.exp(-p[1]*x) + p[2]
. Laissez-moi savoir si cela fonctionne pour vous.y
valeurs, puis pour obtenir de l'corriger les erreurs sur les paramètres d'ajustement, j'ai besoin d'utiliserabsolute_sigma = True
, ai-je raison? Si je ne l'utilise pas, je peux voir que les erreurs obtenues sont très petites, pourquoi est-ce donc? Ce n'absolute_sigma = False
(le cas par défaut) faire lors de chaquey
valeur a sa propre erreur ?curvefit
et aura un effet sur les valeurs ajustées, mais pas sur la matrice de covariance. Quand vous ditesabsolute_sigma=True
vous ditescurvefit
que votre sigma ne sont pas seulement le poids, mais aussi de réelles incertitudes dans les mêmes unités que $y$. Dans ce cascurvefit
va de l'avant et renvoie l'onu normalisés en fonction de la matrice de covariance danspcov
. De cette façon, vous pouvez prendre la racine carrée de la diagonale des entrées danspcov
pour obtenir directement les erreurs de paramètre.optimize.curve_fit
- je obtenirValueError:
sigma` a incorrect forme". D'autres rencontré ce problème?Trouvé votre question, tout en essayant de répondre à mes propres question.
Réponse courte. Le
cov_x
que leastsq sorties doit être multipliée par la variance résiduelle. c'est à direcomme dans
curve_fit.py
. C'est parce que leastsq sorties de la fraction de la matrice de covariance. Mon gros problème est que la variance résiduelle se présente comme quelque chose d'autre quand googler il.La variance résiduelle est réduite tout simplement chi carré à partir de votre ajustement.
Il est possible de calculer exactement les erreurs dans le cas de la régression linéaire. Et en effet, le leastsq fonction donne les valeurs qui sont différentes:
de sortie:
C'est intéressant, les résultats curvefit et bootstrap va donner...