scipy.optimize.least_squares работает только с довольно точным начальным предположением - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь подогнать гауссову функцию к некоторым данным. Этот пример с искусственными данными и работает хорошо:

from scipy import optimize
fitfun = lambda p, x: p[3]+p[2]*np.exp(-2*((x-p[0])**2)/(p[1]**2))
errfun = lambda p, x, y: fitfun(p, x) - y

tdata=fitfun([1300,160,7,.001],np.arange(2000))
p0=([1300,1,1,1])
fit_result=optimize.least_squares(errfun,
                       p0[:],
                       method='lm',#bounds=fit_bounds,
                       args=(np.arange(2000),tdata)
                       )

Я получаю правильную подгонку. Но когда я использую p0=([130,1,1,1]), например, подгонка возвращает совершенно бесполезный набор параметров [129.99586523, -0.1358638 , -0.70220641, 0.70320701].

С реальными данными у меня возникают проблемы даже при предоставлении очень близких начальных значений для центра масс амплитуды (p0 [0]) и широту функции (p0 [1]). Здесь амплитуда (p0 [2]) слишком мала.

Почему это? И как мне получить хорошую посадку?

...