Correct fitting with scipy curve_fit including errors in x?

前端 未结 1 1125
我在风中等你
我在风中等你 2020-12-13 05:56

I\'m trying to fit a histogram with some data in it using scipy.optimize.curve_fit. If I want to add an error in y, I can simply do so by applying

相关标签:
1条回答
  • 2020-12-13 06:15

    scipy.optmize.curve_fit uses standard non-linear least squares optimization and therefore only minimizes the deviation in the response variables. If you want to have an error in the independent variable to be considered you can try scipy.odr which uses orthogonal distance regression. As its name suggests it minimizes in both independent and dependent variables.

    Have a look at the sample below. The fit_type parameter determines whether scipy.odr does full ODR (fit_type=0) or least squares optimization (fit_type=2).

    EDIT

    Although the example worked it did not make much sense, since the y data was calculated on the noisy x data, which just resulted in an unequally spaced indepenent variable. I updated the sample which now also shows how to use RealData which allows for specifying the standard error of the data instead of the weights.

    from scipy.odr import ODR, Model, Data, RealData
    import numpy as np
    from pylab import *
    
    def func(beta, x):
        y = beta[0]+beta[1]*x+beta[2]*x**3
        return y
    
    #generate data
    x = np.linspace(-3,2,100)
    y = func([-2.3,7.0,-4.0], x)
    
    # add some noise
    x += np.random.normal(scale=0.3, size=100)
    y += np.random.normal(scale=0.1, size=100)
    
    data = RealData(x, y, 0.3, 0.1)
    model = Model(func)
    
    odr = ODR(data, model, [1,0,0])
    odr.set_job(fit_type=2)
    output = odr.run()
    
    xn = np.linspace(-3,2,50)
    yn = func(output.beta, xn)
    hold(True)
    plot(x,y,'ro')
    plot(xn,yn,'k-',label='leastsq')
    odr.set_job(fit_type=0)
    output = odr.run()
    yn = func(output.beta, xn)
    plot(xn,yn,'g-',label='odr')
    legend(loc=0)
    

    fit to noisy data

    0 讨论(0)
提交回复
热议问题