web-dev-qa-db-fra.com

Pourquoi `curve_fit` n'est-il pas en mesure d'estimer la covariance du paramètre si le paramètre correspond exactement?

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?

13
finefoot

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.

13
user6655984