#import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
x = ar(range(10))
y = ar([0,1,2,3,4,5,4,3,2,1])
def gaussian(x,*param):
return param[0]*np.exp(-np.power(x - param[2], 2.) / (2 * np.power(param[4], 2.)))+\
param[1]*np.exp(-np.power(x - param[3], 2.) / (2 * np.power(param[5], 2.)))
popt,pcov = curve_fit(gaussian,x,y,p0=[3,4,3,6,1,1])
print popt
print pcov
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaussian(x,*popt),'ro:',label='fit')
plt.legend()
plt.show()
import numpy as npimport pylab as plt#import matplotlib.pyplot as pltfrom scipy.optimize import curve_fitfrom scipy import asarray as ar,expx = ar(range(10))y = ar([0,1,2,3,4,5,4,3,2,1
Python
高斯
拟合
通常我们进行
高斯
拟合
的办法是导入
scipy
的
curve
_
fit
包,不过这需要自己手写一个
高斯
分布的函数表达式,不是很方便,astropy提供了一个写好的
高斯
拟合
包
from astropy.modeling import models,
fit
ting
import numpy as
np
import matplotlib.pyplot as plt
生成一个
高斯
的数据
为了检验
拟合
结果的好坏,我们先生成一个μ=0.5,σ=0.2的
高斯
数据,并赋予他一个噪
1、leastsq()与
curve
_
fit
()
1.1 leastsq()
Python
中的leastsq()、
curve
_
fit
()
拟合
函数在
scipy
.
optimize
模块中,使用时需要导入。
leastsq()使用最小二乘方法,函数具体形式可以参考官方文档leastsq() 函数,一般我们调用的格式(其余参数默认):
leastsq(func, x0, args=())
# func:误差函数
# x0: 起始估计的参数值
# arg:
拟合
的数据样本
1.2
curve
_
fit
()
拟合
方法——
curve
_
fit
今天来说说
curve
_
fit
拟合
方法,在前面的博文中,我也介绍了其他两种
拟合
方法以及
拟合
优度的计算,有兴趣的读者可以看看:
数学建模方法—【03】
拟合
优度的计算(
python
计算)
数学建模方法—【04】
拟合
方法之
np
.poly
fit
、
np
.poly1d
数学建模方法 — 【05】
拟合
方法之leastsq
1. 概念:
curve
_
fit
是使用非线性最小二乘法将函数f进行
拟合
,寻找到最优曲线.
import numpy as
np
import matplotlib.pyplot as plt
from
scipy
.
optimize
import
curve
_
fit
然后,定义
高斯
函数:
```
python
def gaussian(x, a, b, c):
return a *
np
.
exp
(-(x - b)**2 / (2 * c**2))
其中,参数 `a` 是
高斯
函数的峰值,参数 `b` 是
高斯
函数的中心位置,参数 `c` 是
高斯
函数的标准差。
接着,生成一些数据并添加一些噪声:
```
python
xdata =
np
.linspace(-5, 5, 500)
ydata = gaussian(xdata, 1, 0, 1) + 0.2 *
np
.random.normal(size=len(xdata))
使用 `
curve
_
fit
` 进行
拟合
:
```
python
popt, pcov =
curve
_
fit
(gaussian, xdata, ydata)
其中,`popt` 是
拟合
后的参数值,`pcov` 是协方差矩阵。
最后,绘制
拟合
结果:
```
python
plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata, gaussian(xdata, *popt), 'r-', label='
fit
')
plt.legend()
plt.show()
完整代码如下:
```
python
import numpy as
np
import matplotlib.pyplot as plt
from
scipy
.
optimize
import
curve
_
fit
def gaussian(x, a, b, c):
return a *
np
.
exp
(-(x - b)**2 / (2 * c**2))
xdata =
np
.linspace(-5, 5, 500)
ydata = gaussian(xdata, 1, 0, 1) + 0.2 *
np
.random.normal(size=len(xdata))
popt, pcov =
curve
_
fit
(gaussian, xdata, ydata)
plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata, gaussian(xdata, *popt), 'r-', label='
fit
')
plt.legend()
plt.show()