2017-01-18 1 views
6

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

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) 

Выход

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

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

Существует эта цитата из curve_fit SciPy Reference Guide:

Если матрица Якоби в решении не имеет полный ранга, то метод «ого» возвращает матрицу, заполненную np.inf, с другими методы «trf» и «dogbox» используют Moore-Penrose псевдоинверсию для вычисления ковариационной матрицы.

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

ответ

6

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

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

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

Смежные вопросы