Я пытаюсь подогнать гауссову функцию к некоторым данным. Этот пример с искусственными данными и работает хорошо:
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]) слишком мала.
Почему это? И как мне получить хорошую посадку?