Как получить значение ци в квадрате как вывод scipy.optimize.curve_fit? - PullRequest
0 голосов
/ 01 октября 2018

Можно ли получить значение хи-квадрат в виде прямого вывода scipy.optimize.curve_fit()?

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

Действительно оптимальные параметры и его ковариационная матрицатолько два выхода, которые можно извлечь из curve_fit()?

1 Ответ

0 голосов
/ 01 октября 2018

Невозможно получить значение chi ^ 2 из scipy.optimize.curve_fit напрямую без ручных вычислений.Хотя возможно получить дополнительный вывод из curve_fit помимо popt и pcov, указав аргумент full_output=True, но дополнительный вывод не содержит значения chi ^ 2.(Дополнительным выводом является документ, например, leastsq здесь ).

В случае, когда sigma является массивом MxM, определение функции chi ^ 2, минимизированной с помощью curve_fit, равнонемного отличается.В этом случае curve_fit минимизирует функцию r.T @ inv(sigma) @ r, где r = ydata - f(xdata, *popt) вместо chisq = sum((r / sigma) ** 2) в случае одномерного sigma, см. Документацию параметра sigma.Таким образом, вы также сможете вычислять chi ^ 2 в вашем случае, используя r.T @ inv(sigma) @ r с вашими оптимизированными параметрами.

Альтернативой может быть использование другого пакета, например lmfit , гдезначение квадрата хи можно получить непосредственно из результата подгонки:

from lmfit.models import GaussianModel

model = GaussianModel()

# create parameters with initial guesses:
params = model.make_params(center=9, amplitude=40, sigma=1)  

result = model.fit(n, params, x=centers)
print(result.chisqr)
...