Криволинейный фитинг с асимметричной двойной сигмоидальной функцией SciPy - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь согласовать данные с асимметричной двойной сигмоидальной функцией (называемой «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')

Сюжет

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