Je ne comprends pas curve_fit
n'est pas en mesure d'estimer la covariance du paramètre, augmentant ainsi la OptimizeWarning
ci-dessous. Le MCVE suivant explique mon problème:
MCVE python extrait
from scipy.optimize import curve_fit
func = lambda x, a: a * x
popt, pcov = curve_fit(f = func, xdata = [1], ydata = [1])
print(popt, pcov)
Sortie
\python-3.4.4\lib\site-packages\scipy\optimize\minpack.py:715:
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)
[ 1.] [[ inf]]
Pour a = 1
la fonction correspond exactement à xdata
et ydata
. Pourquoi l'erreur/l'écart n'est-il pas 0
, ou quelque chose de proche de 0
, mais inf
à la place?
Il y a cette citation du curve_fit
Guide de référence SciPy :
Si la matrice jacobienne à la solution n'a pas un rang complet, la méthode 'lm' renvoie une matrice remplie de np.inf, par contre les méthodes 'trf' et 'dogbox' utilisent le pseudoinverse de Moore-Penrose pour calculer la covariance matrice.
Alors, quel est le problème sous-jacent? Pourquoi la matrice jacobienne à la solution n'a-t-elle pas un rang complet?
La formule de la covariance des paramètres ( Wikipedia ) a le nombre de degrés de liberté dans le dénominateur. Les degrés de libertés sont calculés comme (nombre de points de données) nombre de paramètres), qui est 1 - 1 = 0 dans votre exemple. Et --- (this est l'endroit où SciPy vérifie le nombre de degrés de liberté avant de le diviser.
Avec xdata = [1, 2], ydata = [1, 2]
vous obtiendrez une covariance nulle (notez que le modèle correspond toujours exactement: l'ajustement exact n'est pas le problème).
Il s'agit du même type de problème que la variance de l'échantillon non définie si la taille de l'échantillon N est 1 (la formule de la variance de l'échantillon a (N-1) dans le dénominateur). Si nous prenons seulement un échantillon de taille = 1 dans la population, nous n'évaluons pas la variance par zéro, nous ne savons rien de la variance.