首页 文章

Scipy LeastSq错误栏

提问于
浏览
1

我使用来自SciPy的LeastSq将实验光谱拟合到理论预期 . 当然有与实验值相关的错误 . 如何将这些提供给LeastSq或者我需要一个不同的例程?我在文档中找不到任何内容 .

2 回答

  • 1

    scipy.optimize.leastsq函数没有内置的方法来合并权重 . 但是,scipy.optimize.curve_fit函数确实具有 sigma 参数,该参数可用于指示每个y数据点的方差 .

    curve_fit 使用 1.0/sigma 作为权重,其中 sigma 可以是长度为 N 的数组(与 ydata 的长度相同) .

    所以你不得不根据错误条的大小推测每个ydata点的方差,并使用它来确定 sigma .

    例如,如果您声明错误条长度的一半表示1个标准差,那么方差( curve_fit 调用 sigma )将是标准差的平方 .

    sigma = (length_of_error_bar/2)**2
    

    参考:

  • 0

    我自己正在做这件事,所以我将分享我所做的事情,也许我们可以从社区得到一些评论 . 我有一系列以确定的时间间隔采集的数据点,我从中计算出标准偏差 . 我想用sin函数来拟合这些点 . Leastsq通过基于一组参数p最小化残差或数据点与拟合函数之间的差异来实现此目的 . 我们可以通过将它们除以方差或标准差的平方来对残差进行加权 .

    如下:

    from scipy.optimize import leastsq
    import numpy as np
    from matplotlib import pyplot as plt
    def sin_func(t, p):
        """ Returns the sin function for the parameters:
            p[0] := amplitude
            p[1] := period/wavelength
            p[2] := phase offset
            p[3] := amplitude offset
        """
        y = p[0]*np.sin(2*np.pi/p[1]*t+p[2])+p[3]
        return y
    
    def sin_residuals(p, y, t, std):
        err = (y - p[0]*np.sin(2*np.pi/p[1]*t+p[2])-p[3])/std**2
        return err
    
    def sin_fit(t, ydata, std, p0):
    """ Fits a set of data, ydata, on a domain, t, with individual standard 
    deviations, std, to a sin curve given the initial parameters, p0, of the form:
            p[0] := amplitude
            p[1] := period/wavelength
            p[2] := phase offset
            p[3] := amplitude offset
        """
        # optimization # 
        pbest = leastsq(sin_residuals, p0, args=(ydata, t, std), full_output=1)
        p_fit = pbest[0]
    
        # fit to data #
        fit = p_fit[0]*np.sin(2*np.pi/p_fit[1]*t+p_fit[2])+p_fit[3]
    
        return p_fit
    

相关问题