python - 使用非对称双 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')
解决方案
推荐阅读
- ajax - 动态形式 Symfony 的约束违反
- windows-installer - 应用 MSP 补丁时缺少功能
- python - Spyder中的截断输出
- python - 如何在执行程序时修复此错误
- android - 创建后无法立即获取firebase用户
- python - 在python中以二进制形式访问系统输入
- python - 如何获得旧的 matplotlib 1.5.1 版界面?
- google-apps-script - Google Scripts getFiles(),返回什么顺序?
- ssl - 配置 Traefik TLS 时出错“为入口密钥配置 TLS 时出错”不存在
- excel - 从 ODBC 导入时抑制消息“正在获取数据...”?