【问题标题】:How to fit polynomial to data with error bars如何将多项式拟合到带有误差线的数据
【发布时间】:2011-10-03 12:52:36
【问题描述】:

我目前正在使用 numpy.polyfit(x,y,deg) 将多项式拟合到实验数据。但是,我想拟合一个使用基于点的误差加权的多项式。

我找到了scipy.curve_fit,它使用了权重,我想我可以将函数“f”设置为我想要的顺序的多项式,并将我的权重放在“sigma”中,这应该可以实现我的目标。

我想知道还有其他更好的方法吗?

非常感谢。

【问题讨论】:

    标签: python numpy scipy curve-fitting


    【解决方案1】:

    查看http://scipy-cookbook.readthedocs.io/items/FittingData.html,尤其是'Fitting a power-law to data with errors' 部分。它展示了如何将 scipy.optimize.leastsq 与包含误差加权的函数一起使用。

    【讨论】:

    • 我的数据不遵循幂律,所以我不能拟合直线。
    • 没关系,leastsq 拟合适用于线性函数(参数中的线性),这对于多项式是正确的。您只需将要最小化的函数定义为 f(x) = (data - model(x))/error(data)。您通过数据误差的倒数来衡量。查看en.wikipedia.org/wiki/Least_squares#Weighted_least_squares
    • 我刚刚检查了scipy.curve_fit 的文档,它的作用与我的建议相同。它使用最小二乘法,并且可能将平方和加权为 1/sigma**2。
    • 好的,就用curve_fit来实现吧。谢谢。
    • 请注意,链接中描述的方法实际上将错误传播到拟合值中。我很难找到另一个真正做到这一点的例子。
    【解决方案2】:

    这是我的做法,有很多 cmets!

    注意:我用第 q 个第 n 阶多项式拟合来做到这一点。

    from numpy import *
    import pylab
    
    # get data
    fn = 'cooltemp.dat'
    x, y, xerr, yerr = loadtxt(fn,unpack=True, usecols=[0,1,2,3])
    
    # create nth degree polynomial fit
    n = 1
    zn = polyfit(x,y,n) 
    pn = poly1d(zn) # construct polynomial 
    
    # create qth degree polynomial fit
    q = 5
    zq = polyfit(x,y,q) 
    pq = poly1d(zq)
    
    # plot data and fit
    xx = linspace(0, max(x), 500)
    pylab.plot(xx, pn(xx),'-g', xx, pq(xx),'-b')
    pylab.errorbar(x, y, xerr, yerr, fmt='r.')
    
    # customise graph
    pylab.legend(['degree '+str(n),'degree '+str(q),'data'])
    pylab.axis([0,max(x),0,max(y)])
    pylab.xlabel('x label (unit)')
    pylab.ylabel('y label (unit)')
    
    pylab.show()
    

    【讨论】:

    • 这会在点上绘制带有误差线的多项式拟合,但实际上并未在多项式拟合的构造中包含错误(xerryerr)。
    【解决方案3】:

    对于加权多项式拟合,您可以使用:

    numpy.polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=weights)
    

    http://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.polyfit.html

    需要注意的是,在此函数中,权重不应提供为1/variance(这是许多加权应用程序中的常用形式),而是@987654324 @

    虽然curve_fitleastsqpolyfit 更通用、更强大的优化工具(因为它们可以适应任何 函数),但polyfit 的优势在于它可以产生一个(精确的)解析解,因此可能比 curve_fitleastsq 等迭代逼近方法快得多——尤其是在将多项式拟合到多组 y 数据(在相同的 x 向量处获得)的情况下

    更新: 从 numpy 版本 1.7 开始,numpy.polyfit 也将权重作为输入(理想情况下应提供为 1/sigma,而不是 1/variance

    【讨论】:

    • 为什么是1/sigma 而不是1/sigma**2? (文档清楚明确地同意您的观点,即它是1/sigma 而不是1/sigma**2)。
    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 2018-03-16
    • 1970-01-01
    • 2010-09-27
    • 2015-12-16
    • 2015-09-02
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多