¿Por qué `curve_fit ‘no puede estimar la covarianza del parámetro si el parámetro se ajusta exactamente?

No entiendo que curve_fit no puede estimar la covarianza del parámetro, por lo que aumenta el nivel de OptimizeWarning continuación. El siguiente MCVE explica mi problema:

Fragmento de python MCVE

 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) 

Salida

 \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]] 

Para a = 1 la función se ajusta a xdata y ydata exactamente. ¿Por qué no es el error / varianza 0 , o algo cercano a 0 , sino inf lugar?

Hay una cita de la Guía de referencia de SciPy de curve_fit :

Si la matriz jacobiana en la solución no tiene un rango completo, entonces el método ‘lm’ devuelve una matriz rellena con np.inf, por otro lado los métodos ‘trf’ y ‘dogbox’ usan el pseudoinverso de Moore-Penrose para calcular la covarianza matriz.

Entonces, ¿cuál es el problema subyacente? ¿Por qué la matriz jacobiana en la solución no tiene un rango completo?

La fórmula para la covarianza de los parámetros ( Wikipedia ) tiene el número de grados de libertad en el denominador. Los grados de libertades se calculan como (número de puntos de datos) – (número de parámetros), que es 1 – 1 = 0 en su ejemplo. Y aquí es donde SciPy verifica el número de grados de libertad antes de dividirlos.

Con xdata = [1, 2], ydata = [1, 2] obtendría una covarianza cero (tenga en cuenta que el modelo todavía se ajusta exactamente; el problema no es el ajuste exacto).

Este es el mismo tipo de problema, ya que la varianza de la muestra no está definida si el tamaño de la muestra N es 1 (la fórmula para la varianza de la muestra tiene (N-1) en el denominador). Si solo tomamos talla = 1 muestra de la población, no estimamos la varianza por cero, no sabemos nada sobre la varianza.