2017-01-18 5 views
6

Je ne comprends pas curve_fit n'est pas en mesure d'estimer la covariance du paramètre, élevant ainsi le OptimizeWarning ci-dessous. Le MCVE suivant explique mon problème:Pourquoi `curve_fit` n'est-il pas capable d'estimer la covariance du paramètre si le paramètre correspond exactement?

MCVE extrait de python

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) 

de 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 à xdata et ydata exactement. Pourquoi l'erreur/variance n'est pas 0, ou quelque chose près de 0, mais inf à la place?

Il y a cette citation du curve_fit SciPy Reference Guide:

Si la matrice jacobienne à la solution n'a pas de rang plein, puis méthode « lm » renvoie une matrice remplie de np.inf, de l'autre Les méthodes main 'trf' et 'dogbox' utilisent le pseudo-inverse de Moore-Penrose pour calculer la matrice de covariance.

Alors, quel est le problème sous-jacent? Pourquoi la matrice jacobienne à la solution n'a-t-elle pas un rang complet?

Répondre

6

La formule pour 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), ce 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 tient toujours exactement: l'ajustement exact n'est pas un problème). C'est le même genre de problème que la variance d'échantillon étant indé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 ne prenons que la taille = 1 échantillon de la population, nous n'estimons pas la variance par zéro, nous ne savons rien de la variance.