Уравнение, которое вы выбрали для функции logisti c, не идеально подходит для вашего набора данных. Предполагается, что минимальное значение для ваших данных равно нулю, а срединная точка сигмоиды также равна нулю, ни одно из которых не является истинным.
Если вы используете уравнение из Википедии и добавляете смещение off
, поскольку ваши данные изменяются в диапазоне от -205 до -165:
def logifunc(x,A,x0,k,off):
return A / (1 + np.exp(-k*(x-x0)))+off
Я переключил l
на A
, поскольку A
теперь представляет разницу между максимальными и минимальными значениями ваших данных ( амплитуда). При разумных стартовых параметрах:
popt, pcov = curve_fit(logifunc, x, y, p0=[50,185,0.1,-222])
plt.scatter(x,y,label='Logistic function')
plt.plot(x_data, logifunc(x_data, *popt), 'r-',label='Fitted function')
plt.legend()
![data and fit](https://i.stack.imgur.com/UW40I.png)
print(popt)
[ 37.07 187.83 0.19 -203.56]