python 实现最小二乘


  1. curve_fit()函数对高斯分布进行拟合,xϵ[0,10],高斯分布函数为y=a*np.exp(-(x-b)**2/(2*c**2)) ,其中真实值a=1,b=5,c=2。试对y加入噪声之后进行拟合, 并作图与真实数据进行比较。(参见课件leastsq(),curve_fit()拟合)



    用最小二乘进行拟合leastsq()


    #导入包和相应的模块


    import numpy as np


    from scipy.optimize importleastsq


    import pylab as pl


    #定义高斯分布函数


    def func(x,p):


     a,b,c=p


    returna*np.exp(-(x-b)**2/(2*c**2)) 


    def error(p,y,x):


    return y-func(x,p)


    #给定50个点进行拟合


    x=np.linspace(0,10,50)


    a,b,c=1,5,2


    #真实数据


    y0=func(x,[a,b,c])


    # 加入噪声之后的实验数据


    np.random.seed(0)


    y1 = y0 + 2 *np.random.randn(len(x))


    #给定拟合参数


    p0=[1.2,4.8,2.3]


    #调用最小二乘法leastsq进行数据拟合args表示需要拟合的实验数据


    plsq=leastsq(error,p0,args=(y1,x))


    print(u"真实参数:",[a,b,c])


    print(u"拟合参数:",plsq[0])


    pl.plot(x,y0,label=u"真实数据")


    pl.plot(x,y1,"r",label=u"带噪声的实验数据")


    pl.plot(x,func(x,plsq[0]),label=u"最小二乘leastsq拟合数据")


    pl.legend()


    pl.show()


    打印结果:


    真实参数: [1, 5, 2]


    拟合参数: [2.53837528 -2.93204702  4.93649449]



    curve_fit()拟合


    #导入包和相应的模块


    import numpy as np


    from scipy.optimize importcurve_fit


    import pylab as pl


    def func(x,a,b,c):


        return a*np.exp(-(x-b)**2/(2*c**2))


    x = np.linspace(0, 10, 50)


    a,b,c=1,5,2


    y0=func(x,a,b,c)


    y1 = y0 + 2 *np.random.randn(len(x))


    p0=[1.2,4.8,2.3]


    #调用curve.fit进行拟合


    popt, _ = curve_fit(func, x, y1,p0=p0)


    print(popt)


    print(_)


    pl.plot(x, y0, label=u"真实数据") 


    pl.plot(x, y1, "r",label=u"带噪声的实验数据")


    pl.plot(x, func(x,popt[0],popt[1],popt[2]), label=u"拟合数据")


    pl.legend()


    pl.show()


    打印结果:


    [ 1.38246061  8.3616111 -2.18726281]


    [[ 0.23156021 -0.09837048  0.35122141]


     [-0.09837048 2.17958559 -1.4644253 ]


     [ 0.35122141 -1.4644253   2.22807717]]



     




猜你喜欢

转载自blog.csdn.net/qq_16668303/article/details/80620948