用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]]
python 实现最小二乘
最新推荐文章于 2023-03-22 10:26:13 发布