Scipy LeastSq错误栏

时间:2012-10-31 16:31:12

标签: python scipy least-squares

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

2 个答案:

答案 0 :(得分: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

参考:

答案 1 :(得分: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