Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 高斯数据拟合随x数据位置的变化而变化_Python_Curve Fitting_Gaussian_Data Fitting - Fatal编程技术网

Python 高斯数据拟合随x数据位置的变化而变化

Python 高斯数据拟合随x数据位置的变化而变化,python,curve-fitting,gaussian,data-fitting,Python,Curve Fitting,Gaussian,Data Fitting,我很难理解,如果我将对应于一组数据的x值的间隔(xdata1移动到xdata2),为什么我的高斯拟合对一组数据(ydata)不起作用。高斯函数写为: 其中A只是一个振幅因子。更改数据的某些值很容易使其适用于这两种情况,但也可以很容易地找到它不适用于xdata1的情况,以及参数协方差未估计的情况。 我在Windows7上的Spyder和Python3.7.1中使用了scipy.optimize.curve\u fit 问题是,您第二次尝试拟合高斯曲线时,在搜索参数空间时陷入了局部极小值:cur

我很难理解,如果我将对应于一组数据的x值的间隔(
xdata1
移动到
xdata2
),为什么我的高斯拟合对一组数据(
ydata
)不起作用。高斯函数写为:

其中A只是一个振幅因子。更改数据的某些值很容易使其适用于这两种情况,但也可以很容易地找到它不适用于
xdata1
的情况,以及参数协方差未估计的情况。 我在Windows7上的Spyder和Python3.7.1中使用了
scipy.optimize.curve\u fit


问题是,您第二次尝试拟合高斯曲线时,在搜索参数空间时陷入了局部极小值:curve_fit是一个包装器,它使用梯度下降来最小化代价函数,这很容易得到

您应该尝试提供合理的启动参数(通过使用的
p0
参数),以避免出现以下情况:

 #...  your code

 y_max = np.max(y_data)
 max_pos = ydata[ydata==y_max][0]
 initial_guess = [y_max, max_pos, 1] # amplitude, mean, std

 popt2, pcov2 = curve_fit(gaussian, xdata2, ydata, p0=initial_guess)
如您所见,它提供了合理的配合:

您应该编写一个函数,该函数可以提供对启动参数的合理估计。这里我找到了最大的y值,并用它来确定初始参数。我发现这对于拟合正态分布很有效,但是你可以考虑其他方法。< /P> 编辑:

您还可以通过缩放振幅来解决此问题:振幅太大,参数空间扭曲,梯度下降仅遵循振幅最大变化的方向,并且有效地忽略了sigma。在参数空间中考虑下面的图(颜色是给定参数的拟合的平方残差之和,并且白色交叉表示最优解):

确保记下x轴和y轴的不同刻度

一个人需要在y(振幅)中进行大量的“单位”大小的步进,以从点x,y=(0,0)达到最小值,因为你只需要少于一个“单位”大小的步进就可以达到x(σ)的最小值。由于这是最陡的梯度,因此该算法只需在振幅上采取步骤。当到达使成本函数最小化的振幅时,它会简单地停止算法,因为它似乎已经收敛,并且sigma参数几乎没有变化


解决此问题的一种方法是缩放ydata以消除参数空间的扭曲:将
ydata
除以100,您将看到您的拟合效果,而不提供任何起始参数

可能更好的方法是在拟合数据之前对数据进行标准化,即重新调整数据的比例,使其具有零均值和单位方差。事实上,如果您知道您的数据是正态分布的,并且已经提供了您正在寻找的参数。您可以计算这些起始参数(即,计算方差和平均值,并将其用作
p0
),我想这会有相同的结果吗?有没有理由这样做会更好?我在这里介绍的方法的优点是,你不需要转换数据。事实上,如果你的数据点是从正态分布中取样的,那么样本均值和方差是基础分布均值和方差的最大似然估计量,即,它们提供了该参数的最佳估计。如果数据不是从正态分布中取样的,这当然不是真的,所以你对不对称性有一个公平的观点。当然,我同意,但我认为这是离题的。我认为OP没有必要说这些数据来自正态分布。看起来这些数据可能来自实验。我建议你把这些评论框成一个答案,以防有人从正态分布中取样,因为这是一个很好的讨论。我将留下我的答案:这是非常一般的,你可以测试你的数据是否符合正态分布的假设,如果不容易拟合另一个函数的话。感谢你提出的关于提供初始猜测并强调
曲线拟合如何工作的建议,@FChm,这确实是一个很好的解决拟合问题的方法。还感谢您的评论,@FChm,@user1587520,数据不是从正态分布中取样的。
 #...  your code

 y_max = np.max(y_data)
 max_pos = ydata[ydata==y_max][0]
 initial_guess = [y_max, max_pos, 1] # amplitude, mean, std

 popt2, pcov2 = curve_fit(gaussian, xdata2, ydata, p0=initial_guess)