Python2: Подгонка многопараметрической суммы функций с помощью scipy.optimize.curve_fit - PullRequest
1 голос
/ 10 апреля 2019

Это мой первый пост о переполнении стека, поэтому, пожалуйста, наберитесь терпения, если какая-либо информация отсутствует.

Я пытаюсь согласовать функцию с помощью данных, используя Python 2.7.15 (ubuntu 18.04) с scipy.optimize.curve_fit ().Эта функция подбора состоит из суммы переменного числа экспонент с соответствующими параметрами, которые передаются через параметр * args моей функции подбора.

Я пробовал передавать векторы параметров в мою функцию подбора.К сожалению, кажется, что сумма экспонент, которую я выполняю с помощью цикла for, на самом деле интерпретируется как numpy.ndarray, где это должно быть одно значение, которое будет возвращено в алгоритм подбора.Ниже приведен (упрощенный) пример того, что я пробовал:

import numpy as np
import scipy
import math
from scipy import optimize

# Fitting function:
def fitFuncTau(amplitude, nFit, t, *args):
    C0=args[0]
    C=list(args[1:(nFit+1)])
    tau=list(args[(nFit+1):(2*nFit+2)])
    sumFit=0
    for i in range(0, nFit):
        sumFit+=C[i]*np.exp(-t/tau[i])
    print sumFit
    return C0+amplitude*sumFit

#Fitting Args: C0 parameter, then two lists C[] and tau[] (size Nfit)
fitArgs=[1, 0.01, 0.01, 0.1, 0.1]
nFit=2
amplitude=1

# Dummy fitting data
x=np.linspace(0, 4, 100)
np.random.seed(1729)
y=np.random.normal(size=x.size)

#Fit
wrapFunc=lambda t, *args: fitFuncTau(amplitude, nFit, t, *args)
fit_opt, fit_cov = scipy.optimize.curve_fit(wrapFunc, x, y, p0=fitArgs)

Любая помощь будет высоко ценится!

1 Ответ

1 голос
/ 10 апреля 2019

Попробуйте использовать автономную функцию fitFuncTau.fitFuncTau(1, 2, 3, 4, 5, 6, 7, 8) (или любые другие значения, которые вы хотите указать для заполнения правильного количества параметров) печатает только число, а не список.

Я не могу найти какой-либо документ или ссылку, чтобы доказать это, но я думаю, это простооптимизация печати выполняется с помощью curve_fit().
Все вызовы print, связанные с каждым элементом x, собираются в список, и список печатается.Если вы проверите, длина напечатанного списка совпадает с вашим массивом x (в вашем случае 100).

Это не должно повлиять на результат подгонки.Проверьте, являются ли значения в fit_opt разумными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...