Почему "curve fit"не может оценить ковариацию параметра, если параметр точно соответствует?

Я не понимаю curve_fit не может оценить ковариацию параметра, тем самым повышая OptimizeWarning ниже. Следующая MCVE объясняет мою проблему:

MCVE фрагмент 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)

выход

python-3.4.4libsite-packagesscipyoptimizeminpack.py:715:
OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)

[ 1.] [[ inf]]

на a = 1 функция подходит xdata и ydata точно. Почему не ошибка / дисперсия 0, или что-то близкое к 0, а ?

есть в этом цитата из curve_fit Справочник SciPy:

если матрица Якобиана в решении не имеет полного ранга, то метод " lm " возвращает матрицу, заполненную np.inf, с другой стороны, методы " trf " и "dogbox" используют псевдоинверсию Мура-Пенроуза для вычисления ковариационной матрицы.

Итак, в чем основная проблема? Почему матрица Якоби в решении не имеет полного ранга?

1 ответов


формула ковариации параметров (Википедия) имеет число степеней свободы в знаменателе. Степени свобод вычисляются как (количество точек данных) - (количество параметров), что в вашем примере равно 1 - 1 = 0. И этой где SciPy проверяет количество степеней свободы перед разделением на него.

С xdata = [1, 2], ydata = [1, 2] вы получите нулевую ковариацию (обратите внимание, что модель по-прежнему точно подходит: точная подгонка не проблема.)

это та же проблема, что и дисперсия выборки, которая не определена, если размер выборки N равен 1 (формула для дисперсии выборки имеет (N-1) в знаменателе). Если бы мы взяли только выборку size=1 из популяции, мы не оцениваем дисперсию на ноль, мы ничего не знаем о дисперсии.