首页 > 解决方案 > 使用非对称双 sigmoidal 函数 SciPy 进行曲线拟合

问题描述

我正在尝试使用非对称双 sigmoidal 函数(称为“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')

阴谋

标签: pythonnumpymatplotlibscipycurve-fitting

解决方案


推荐阅读