В Scipy, как и почему curve_fit вычисляет ковариацию оценок параметров

Я использовал scipy.optimize.leastsq для соответствия некоторым данным. Я хотел бы получить некоторые доверительные интервалы для этих оценок, поэтому я смотрю на вывод cov_x, но в документации очень неясно, что это такое и как получить из этого матрицу ковариации для моих параметров.

Во-первых, это говорит о том, что это якобиан, но в примечания в нем также говорится, что «cov_x является приближением якобиана к гессиану», так что на самом деле это не якобиан, а гессиан, использующий некоторое приближение от якобиана. Какое из этих утверждений верно?

Во-вторых, эта фраза меня сбивает с толку:

Эту матрицу необходимо умножить на остаточную дисперсию, чтобы получить ковариацию оценок параметров – см. curve_fit.

Я действительно иду смотреть исходный код для curve_fit, где они делают:

s_sq = (func(popt, *args)**2).sum()/(len(ydata)-len(p0))
pcov = pcov * s_sq

что соответствует умножению cov_x на s_sq, но я не могу найти это уравнение ни в одном справочнике. Кто-нибудь может объяснить, почему это уравнение правильное? Моя интуиция подсказывает мне, что должно быть наоборот, поскольку cov_x должно быть производным (якобианским или гессианским), поэтому я подумал: cov_x * covariance(parameters) = sum of errors(residuals), где sigma(parameters) — это то, что я хочу.

Как связать то, что делает curve_fit, с тем, что я вижу, например. википедия: http://en.wikipedia.org/wiki/Propagation_of_uncertainty#Non-linear_combinations


person HansHarhoff    schedule 13.02.2013    source источник


Ответы (3)


Хорошо, кажется, я нашел ответ. Сначала решение: cov_x*s_sq — это просто ковариация параметров, что вам и нужно. Взятие sqrt диагональных элементов даст вам стандартное отклонение (но будьте осторожны с ковариациями!).

Остаточная дисперсия = уменьшенный хи-квадрат = s_sq = sum[(f(x)-y)^2]/(N-n), где N — количество точек данных, а n — количество подгоночных параметров. Уменьшенный хи-квадрат.

Причина моего замешательства в том, что cov_x, заданный наименьшим квадратом, на самом деле не то, что называется cov(x) в других местах, а сокращенное cov(x) или дробное cov(x). Причина, по которой он не отображается ни в одной из других ссылок, заключается в том, что это простое изменение масштаба, которое полезно в числовых вычислениях, но не имеет отношения к учебнику.

Что касается гессиана и якобиана, документация плохо сформулирована. В обоих случаях вычисляется именно гессиан, что очевидно, поскольку якобиан в минимуме равен нулю. Они имеют в виду, что используют приближение к якобиану для нахождения гессиана.

Еще одно замечание. Кажется, что результат curve_fit на самом деле не учитывает абсолютный размер ошибок, а учитывает только относительный размер предоставленных сигм. Это означает, что возвращаемый pcov не изменится, даже если шкала погрешностей изменится в миллион раз. Это, конечно, неправильно, но кажется стандартной практикой, т.е. Matlab делает то же самое при использовании своего набора инструментов Curve fit. Правильная процедура описана здесь: https://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)#Parameter_errors_and_correlation

Кажется довольно простым сделать это после того, как найден оптимум, по крайней мере, для линейного метода наименьших квадратов.

person HansHarhoff    schedule 13.02.2013
comment
Я думаю, формулу для хи-квадрата следует умножить на 1,0/ошибки ^ 2? - person FreelanceConsultant; 20.10.2016
comment
«Похоже, что результат curve_fit на самом деле не учитывает абсолютный размер ошибок, а учитывает только относительный размер предоставленных сигм». Для этого есть флаг: absolute_sigma. Если он выключен (по умолчанию), то curve_fit оценит var(y) на основе ваших данных; в противном случае потребуется использовать предоставленные вами значения sigma. - person Rufflewind; 07.01.2017

Я нашел это решение во время поиска похожего вопроса, и у меня есть лишь небольшое улучшение ответа HansHarhoff. Полный вывод наименьшего квадрата обеспечивает возвращаемое значение infodict, которое содержит infodict['fvec'] = f(x) -y. Таким образом, чтобы вычислить приведенный хи-квадрат = (в приведенных выше обозначениях)

s_sq = (infodict['fvec']**2).sum()/ (N-n)

КСТАТИ. Спасибо HansHarhoff за то, что он проделал большую часть тяжелой работы, чтобы решить эту проблему.

person Jim Parker    schedule 07.07.2013
comment
Очень хорошо! Именно то, что я искал. В частности: result=scipy.optimize.leastsq(...,, full_output=True);s_sq = (result]['fvec']**2).sum()/(len(result[2]['fvec'])-len(result[0])) - person Charles Plager; 14.01.2015
comment
какая у вас версия для поддержки full_output? - person VMAtm; 01.12.2015
comment
Я не знаю, какой должна быть минимальная версия для поддержки опции full_output, но я использую scipy 0.13.3 и 0.14.1. - person Jim Parker; 02.12.2015
comment
@CharlesPlager, тебе не хватает [2 там ... s_sq = (result[2]['fvec']**2).sum()/(len(result[2]['fvec'])-len(result[0])) - person Asking Questions; 05.08.2018

Математика

Сначала мы начнем с линейной регрессии. Во многих статистических задачах мы предполагаем, что переменные имеют некоторые базовые распределения с некоторыми неизвестными параметрами, и мы оцениваем эти параметры. В линейной регрессии мы предполагаем, что зависимые переменные yi имеют линейную связь с независимыми переменными xij:

yi = xi1β1 + ... + xipβp > + σεi, i = 1, ..., n.

где εi имеет независимое стандартное нормальное распределение, βj - это p неизвестных параметров, а также неизвестно σ. Мы можем записать это в матричной форме:

Y = X β + σε,

где Y, β и ε — вектор-столбец. Чтобы найти наилучшее β, мы минимизируем сумму квадратов

S = (Y - X β)T (Y - X β).

Я просто пишу решение, которое

β^ = (XT X)-1 XT Y.

Если мы видим Y как конкретные наблюдаемые данные, β ^ является оценкой β при этом наблюдении. С другой стороны, если мы рассматриваем Y как случайную величину, оценка β^ также становится случайной величиной. Таким образом, мы можем увидеть, какова ковариация β^.

Поскольку Y имеет многомерное нормальное распределение, а β^ является линейным преобразованием Y, β^ также имеет многомерное нормальное распределение. Ковариационная матрица β^ равна

Cov(β^) = (XT X)-1 XT Cov(Y) ((XT > X)-1 XT)T = (X T X)-1 σ2.

Но здесь σ неизвестен, поэтому его тоже нужно оценить. Если мы позволим

Q = (Y - X β^)T (Y - X β^),

можно доказать, что Q / σ2 имеет распределение хи-квадрат с n - p степенями свободы (при этом Q не зависит от β^). Это делает

σ^2 = Q / (n - p)

несмещенная оценка σ2. Таким образом, окончательная оценка Cov(β^) равна

(XT X)-1Q/(n - p).

SciPy-API

curve_fit наиболее удобен, второе возвращаемое значение pcov — это всего лишь оценка ковариации β^, то есть окончательный результат (XT X)-1 Q/ (н - р) выше.

В leastsq второе возвращаемое значение cov_x равно (XT X)-1. Из выражения S мы видим, что XT X является гессианом S (точнее, половиной гессиана), поэтому в документе говорится, что cov_x является обратным гессиану. Чтобы получить ковариацию, нужно умножить cov_x на Q/(n - p).

Нелинейная регрессия

В нелинейной регрессии yi зависит от параметров нелинейно:

yi = f(xi, β1, ..., βp) + σεi.

Мы можем вычислить частные производные от f по βj, поэтому она становится приблизительно линейной. Тогда расчет в основном такой же, как линейная регрессия, за исключением того, что нам нужно итеративно аппроксимировать минимум. На практике алгоритм может быть более сложным, например, алгоритм Левенберга-Марквардта, который по умолчанию имеет значение curve_fit.

Подробнее о предоставлении Sigma

Этот раздел посвящен параметрам sigma и absolute_sigma в curve_fit. Для базового использования curve_fit, когда у вас нет предварительных знаний о ковариации Y, вы можете игнорировать этот раздел.

Абсолютная сигма

В приведенной выше линейной регрессии дисперсия yi равна σ и неизвестна. Если вы знаете разницу. Вы можете предоставить его curve_fit через параметр sigma и установить absolute_sigma=True.

Предположим, что предоставленная вами матрица sigma равна Σ. то есть

Y ~ N(X β, Σ).

Y имеет многомерное нормальное распределение со средним X β и ковариацией Σ. Мы хотим максимизировать вероятность Y. Из функции плотности вероятности Y, которая эквивалентна минимизации

S = (Y - X β)T Σ-1 (Y - X β).

Решение

β^ = (XT Σ-1 X)-1 XT Σ-1< /sup> Ю.

И

Cov(β^) = (XT Σ-1 X)-1.

Приведенные выше β^ и Cov(β^) являются возвращаемыми значениями curve_fit с absolute_sigma=True.

Относительная сигма

В некоторых случаях вы не знаете точную дисперсию yi, но знаете относительную связь между различными yi, например дисперсию y 2 в 4 раза превышает дисперсию y1. Затем вы можете передать sigma и установить absolute_sigma=False.

Этот раз

Y ~ N(X β, Σσ)

с заданной известной матрицей Σ и неизвестным числом σ. Целевая функция, которую нужно минимизировать, такая же, как абсолютная сигма, поскольку σ является константой, и, следовательно, оценщик β^ тот же. Но ковариация

Cov(β^) = (XT Σ-1 X)-1 σ2,

содержит неизвестное σ. Для оценки σ пусть

Q = (Y - X β^)T Σ-1 (Y - X β^).

Опять же, Q / σ2 имеет распределение хи-квадрат с n - p степенями свободы.

Оценка Cov(β^) равна

(XT Σ-1 X)-1Q/(n - p).

И это второе возвращаемое значение curve_fit с absolute_sigma=False.

person Cosyn    schedule 14.11.2020