Почему "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 из популяции, мы не оцениваем дисперсию на ноль, мы ничего не знаем о дисперсии.