【问题标题】:Curve fitting in Python using scipy使用 scipy 在 Python 中进行曲线拟合
【发布时间】:2015-09-14 14:35:34
【问题描述】:

我想在 scipy 中使用 curve_fit 为一些数据拟合曲线。在我搜索语法后,我发现了这个,

import numpy as np
from scipy.optimize import curve_fit

def func(x, a, b, c):
     return a * np.exp(-b * x) + c

xdata = np.linspace(0, 4, 50)
y = func(xdata, 2.5, 1.3, 0.5)
ydata = y + 0.2 * np.random.normal(size=len(xdata))

popt, pcov = curve_fit(func, xdata, ydata)

但是文档不是很清楚,特别是关于函数func的参数,我知道x是自变量值的numpy数组,但是a、b和c是什么?还有,这条线是什么意思,

a * np.exp(-b * x) + c 

计算 y 我们用自变量和其他参数调用 func,但是 ydata 是什么?而我们为什么要这样计算呢,

ydata = y + 0.2 * np.random.normal(size=len(xdata))

最后一件事,如果我在某个函数中通过 scipy 获得拟合模型(方程),我该如何在另一个函数中使用它?

感谢任何帮助。 谢谢。

【问题讨论】:

    标签: python numpy scipy curve-fitting


    【解决方案1】:

    curve_fit 拟合一组数据 ydata,每个点都以自变量 x 的值给出某个模型函数。在示例中,模型函数为a * exp(-b * x) + c,其中abc 是一些常数,需要确定以最好地表示该模型的数据。

    func计算得到的y是模型函数在每个数据点的值x

    在示例中,ydata 由拟合函数模拟,其中添加了一些随机高斯(正态分布)噪声:

    ydata = y + 0.2 * np.random.normal(size=len(xdata))
    

    您可以通过在xdata 上绘制y(绿线)和ydata(蓝点)来查看这一点:

    要使用拟合参数popt,请将它们传递给func

    yfit = func(xdata, *popt)
    

    图表将显示“精确”(绿线)和拟合(蓝线)的比较:

    【讨论】:

    • 谢谢@xnx,在ydata中,为什么数量乘以0.2? a、b 和 c 的初始选择是什么?因为我用不同的a,b,c试过这个curve_fit函数,根本不适合,我的数据比较分散,有没有比曲线拟合更好的解决方案?
    • 0.2 只是重新调整了噪声,因此对于示例来说没有太多;如果您无法将您的特定数据很好地拟合到这个func,也许根本没有任何abc 可以很好地使用这个模型。解决方案是使用不同的模型函数,func!
    • 谢谢,有什么众所周知的非线性函数可以使用吗?另外,根据您的回答,我了解到 y 是模型,ydata 只是一些随机生成的数据,用于显示拟合曲线 y 的效果,这是正确的吗?
    • 没错。恐怕不知道您的数据代表什么,就不可能推荐非线性函数。通常,在尝试拟合之前,您会想到一个模型函数。
    • 好,我会选择最适合数据形状的函数。谢谢。
    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2013-10-10
    • 2021-11-14
    • 2014-09-08
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多