Я пытаюсь согласовать данные с асимметричной двойной сигмоидальной функцией (называемой «des ()»), и, несмотря на многие попытки, я не могу получить очень хорошую подгонку.
Наилучший полученный R-квадрат равен 0,96, а кривая соответствия далека от ymax. Я попытался поиграть с начальным предположением p0, но это не помогло лучше приспособиться.
Как мне лучше приспособиться?
Любая помощь будет очень признательна.
Спасибо.
from __future__ import print_function
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import scipy.optimize as opt
xdata = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
ydata = [1, 33, 90, 103 , 141, 96, 85, 86, 43, 32, 17, 9, 8, 6, 11, 4, 4, 1]
def des(x,a,b,c,d,e,f) :
y = a + (b/(1+(np.exp(-1*((x-c+(d/2))/e)))))*(1-(1/(1+np.exp(-1*((x-c-(d/2))/f)))))
return (y)
p0 =[10,1000,1,1,1,11]
popt, pcov = opt.curve_fit(des,xdata,ydata, p0 =p0, maxfev = 1000000)
residuals = ydata - des(xdata, *popt)
ss_res = np.sum(residuals**2)
ss_tot = np.sum((ydata-np.mean(ydata))**2)
r_squared = 1 - (ss_res / ss_tot)
print(r_squared)
y = des(xdata,*popt)
fig,ax = plt.subplots(1,1,figsize=(6,4))
ax.plot(xdata,ydata, label='data')
ax.plot(xdata,y,label='fit')
plt.legend()
plt.title('HBD',fontdict=None, loc='center', pad=None)
plt.xlabel('HBD')
plt.ylabel('Frequency')
Сюжет