Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据拟合高斯积分函数_Python_Numpy_Model Fitting - Fatal编程技术网

Python 数据拟合高斯积分函数

Python 数据拟合高斯积分函数,python,numpy,model-fitting,Python,Numpy,Model Fitting,我在为一组给定数据寻找最小二乘拟合时遇到了一个问题。 我知道数据遵循的函数是高斯和矩形的卷积(x射线穿过宽缝)。到目前为止,我所做的是查看卷积积分,发现它可以归结为: 积分参数a是狭缝宽度(未知和期望),其中g(x-t)是定义为 基本上,拟合函数是高斯函数的积分函数,积分边界由宽度参数a给出。然后,通过x-t偏移进行积分 这是一小部分的数据和手工制作的适合。 从派拉布进口* 从scipy.optimize导入曲线\u拟合 从scipy.integrate导入四元组 # 1/10 of the D

我在为一组给定数据寻找最小二乘拟合时遇到了一个问题。 我知道数据遵循的函数是高斯和矩形的卷积(x射线穿过宽缝)。到目前为止,我所做的是查看卷积积分,发现它可以归结为: 积分参数a是狭缝宽度(未知和期望),其中g(x-t)是定义为 基本上,拟合函数是高斯函数的积分函数,积分边界由宽度参数a给出。然后,通过x-t偏移进行积分

这是一小部分的数据和手工制作的适合。 从派拉布进口* 从scipy.optimize导入曲线\u拟合 从scipy.integrate导入四元组

# 1/10 of the Data to show the form.
xData = array([-0.1 , -0.09, -0.08, -0.07, -0.06, -0.05, -0.04, -0.03, -0.02,
       -0.01,  0.  ,  0.01,  0.02,  0.03,  0.04,  0.05,  0.06,  0.07,
        0.08,  0.09,  0.1 ])
yData = array([  18.      ,   22.      ,   22.      ,   34.000999,   54.002998,
        152.022995,  398.15799 ,  628.39502 ,  884.781982,  848.719971,
        854.72998 ,  842.710022,  762.580994,  660.435974,  346.119995,
        138.018997,   40.001999,    8.      ,    6.      ,    4.      ,
        6.      ])
yerr = 0.1*yData # uncertainty of the data

plt.scatter(xData, yData)
plt.show()

为了证明func确实描述了数据,并且我的计算是正确的,我对数据和函数进行了处理,并试图匹配它们。 我发现以下是可行的:

p0=[850,0,0.01, 0.04] # will be used as starting values for fitting
sample = linspace(-0.1,0.1,200) # just to make the plot smooth
y, dy = vfunc(sample,*p0)       

plt.plot(sample, y, label="Handmade Fit")
plt.scatter(xData, yData, label="Data")
plt.legend()
plt.show()
当我尝试使用刚获得的起始值拟合数据时,就会出现问题:

fp, Sfcov =  curve_fit(vfunc, xData, yData, p0=p0, sigma=yerr)
yf = vfunc(xData, fp)
plt.plot(x, yf, label="Fit")
plt.show()


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-83-6d362c4b9204> in <module>()
----> 1 fp, Sfcov =  curve_fit(vfunc, xData, yData, p0=p0, sigma=yerr)
      2 yf = vfunc(xData,fp)
      3 plt.plot(x,yf, label="Fit")

    /usr/lib/python3/dist-packages/scipy/optimize/minpack.py in curve_fit(f, xdata, ydata, p0, sigma, **kw)
    531     # Remove full_output from kw, otherwise we're passing it in twice.
    532     return_full = kw.pop('full_output', False)
--> 533     res = leastsq(func, p0, args=args, full_output=1, **kw)
    534     (popt, pcov, infodict, errmsg, ier) = res
    535 

/usr/lib/python3/dist-packages/scipy/optimize/minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
    369     m = shape[0]
    370     if n > m:
--> 371         raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))
    372     if epsfcn is None:
    373         epsfcn = finfo(dtype).eps

TypeError: Improper input: N=4 must not exceed M=2
实际上我有210个数据点

就像上面写的那样,我真的不明白为什么我需要使用numpy中的向量函数作为积分函数(func vfunc),但不使用它也没有帮助。通常,可以将numpy数组传递给函数,但在这里它似乎不起作用。另一方面,我可能高估了最小二乘拟合的能力,在这种情况下它可能不可用,但我不喜欢在这里使用最大似然法。一般来说,我从未尝试过将积分函数拟合到数据中,所以这对我来说是新的。问题可能就在这里。我对quad的了解有限,可能有更好的方法。据我所知,用解析方法进行积分是不可能的,但显然是理想的解决方案;)


你知道这个错误是从哪里来的吗?

你有两个问题。一个是
quad
返回一个包含值和错误估计值的元组,另一个是如何进行矢量化。您不希望对vectors参数进行矢量化
np.vectorize
有一个for循环,因此您自己这样做不会带来性能提升:

def func(x, p):
    """ Convolution of gaussian and rectangle is a gaussian integral.
        Parameters: A, mu, sigma, a"""
    A, mu, sigma, a = p
    return quad(lambda t: gaus(x-t,A,mu,sigma),-a,a)[0]

def vfunc(x, *p):
    evaluations = numpy.array([func(i, p) for i in x])
    return evaluations
请注意,我已将
func
中的
*
拿走,但不是从
gaus
拿走。另外,我正在选择
quad
的第一个输出

虽然这解决了你的问题,但是为了适应卷积,你可以考虑去傅立叶空间。卷积的傅里叶变换是函数变换的乘积,这将大大简化你的生活。此外,一旦在傅立叶空间中,可以考虑应用低通滤波器来降低噪声。210个数据点足够高,可以获得良好的结果


此外,如果你需要更强大的算法,你应该考虑imuuIT,使用root的长期验证的MuuIt。< /P>完美。非常感谢你。关于根和傅里叶空间,你可能是对的。下次我再深入研究。到现在为止,我真的很高兴你的纠正。

print("Fit-Parameters: %i"%len(p0))
print("Datapoints: %i"%len(yData))

Fit-Parameters: 4
Datapoints: 21
def func(x, p):
    """ Convolution of gaussian and rectangle is a gaussian integral.
        Parameters: A, mu, sigma, a"""
    A, mu, sigma, a = p
    return quad(lambda t: gaus(x-t,A,mu,sigma),-a,a)[0]

def vfunc(x, *p):
    evaluations = numpy.array([func(i, p) for i in x])
    return evaluations