SciPy曲线拟合显示直线,不适合数据

2024-09-27 21:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一组数据拟合成CDF指数函数。然而,我不确定我的代码或初始参数猜测中到底出了什么问题,但它只创建了一条直线。数据是从CSV文件导入的

#Plot Data
plt.figure(1,dpi=120)
plt.title("Cell A3")
plt.xlabel(rawdata[0][0])
plt.ylabel(rawdata[0][1])
plt.scatter(xdata,ydata,label="A3 Cell 1")



#Define Function
def func(t,lam):
    return 1 - (np.exp(-lam * t))

funcdata = func(xdata,1.17)
plt.plot(xdata,funcdata,label="Model")
plt.legend() 

#CurveFit data to model
popt, pcov = curve_fit(func,xdata,ydata,p0=(-0.64))
perr = np.sqrt(np.diag(pcov)) 

Image of the graph I get with the initial data and the straight line that the curve_fit gives


Tags: the数据datanpcellpltlabela3
2条回答

想想你的数据和你的功能。ydata是一个相当大的值。最大值是多少

def func(t,lam):
    return 1 - (np.exp(-lam * t))

我想你会发现函数的最大值出现在lam接近无穷大时,函数接近1。最大值==1的函数如何在1000秒内拟合数据?如果希望能够扩展到1以上,则需要在函数中添加更多参数。试一试

def func(t,lam,scale):
    return ( 1 - (np.exp(-lam * t)) ) * scale 

看看scipy是否能够更好地拟合数据

编辑: 我设法让它工作,但是,您甚至没有绘制最佳参数。为此,请参阅我的模拟扩展数据和ydata代码:

#Plot Data
import numpy as np
from scipy.optimize import curve_fit
from matplotlib import pyplot as plt

def func(t,lam,scale):
    return ( 1 - (np.exp(-lam * t)) ) * scale

xdata = np.arange(25.)
ydata = func(xdata, 1.12, 2000.)

plt.figure(1,dpi=120)
plt.title("Cell A3")
plt.xlabel(rawdata[0][0])
plt.ylabel(rawdata[0][1])
plt.scatter(xdata,ydata,label="A3 Cell 1")

#CurveFit data to model
popt, pcov = curve_fit(func,xdata,ydata,p0=[0.5, 1000.1])
plt.plot(np.arange(25),func(np.arange(25), *popt),label="Model")
plt.legend() 

产出: Optimized curve_fit

您无法正确拟合这种简单的指数函数:

y=(1-(np.exp(-lam*t)))*刻度

因为此函数的形状与数据的形状相差很远,范围为0<;t<;5.

<>最好考虑Logistic类的函数,例如:

enter image description here

相关问题 更多 >

    热门问题