微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SciPy curve_fit 显示直线并且不适合数据

如何解决SciPy curve_fit 显示直线并且不适合数据

我正在尝试将一组数据拟合到 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,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

解决方法

想想你的数据和你的功能。 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 是否能够更好地拟合数据。

编辑: 我设法让它发挥作用,但是,您甚至没有绘制最佳参数。为此,请查看我使用模拟 xdata 和 ydata 的代码:

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

def func(t,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,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

最好考虑一个逻辑类的函数,例如:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。