如何在Python3.X中通过使用运行中值来改进高斯/法线拟合?

如何在Python3.X中通过使用运行中值来改进高斯/法线拟合?,python,arrays,python-3.x,curve-fitting,gaussian,Python,Arrays,Python 3.x,Curve Fitting,Gaussian,我有一个100x100个数据点的数组,我试图对数组中100个值的每一列执行高斯拟合。然后,我希望通过使用第一列的拟合找到的高斯函数的参数作为下一列使用的起始点的初始参数。假设我从初始参数1000、0和1开始,拟合得到800、3和1.5的值。然后我希望装配工使用这三个参数作为下一列的初始值 我的代码是: x = np.linspace(-50,50,100) Gauss_Model = models.Gaussian1D(amplitude = 1000., mean = 0, stddev =

我有一个100x100个数据点的数组,我试图对数组中100个值的每一列执行高斯拟合。然后,我希望通过使用第一列的拟合找到的高斯函数的参数作为下一列使用的起始点的初始参数。假设我从初始参数1000、0和1开始,拟合得到800、3和1.5的值。然后我希望装配工使用这三个参数作为下一列的初始值

我的代码是:

x = np.linspace(-50,50,100)
Gauss_Model = models.Gaussian1D(amplitude = 1000., mean = 0, stddev = 1.)
Fitting_Model = fitting.LevMarLSQFitter()

Fit_Data = []

for i in range(0, Data_Array.shape[0]):
    Fit_Data.append(Fitting_Model(Gauss_Model, x, Data_Array[:,i]))

现在,每次拟合都使用相同的初始值。有人知道如何为高斯拟合方法执行这样的运行中值/平均值吗?非常感谢您的帮助或指导,谢谢

我不熟悉您正在使用的特定库,但如果您可以使用类似
fit_data[-1]。振幅
fit_data[-1]。意思是
,则可以修改循环以使用以下内容:

for i in range(0, data_array.shape[0]):
    if fit_data:  # true if not an empty list
        Gauss_Model = models.Gaussian1D(amplitude=fit_data[-1].amplitude,
                                        mean=fit_data[-1].mean,
                                        stddev=fit_data[-1].stddev)
    fit_data.append(Fitting_Model(Gauss_Model, x, Data_Array[:,i]))
基本上检查是否已拟合模型,如果已拟合,则使用最新拟合的振幅、平均值和标准偏差作为下一个
高斯_模型的起点


一个想法:这可能会加快拟合速度,但不应导致每次拟合操作中100个数据点的“更好”拟合。您的结果模型可能是最适合它所呈现数据的模型。如果要估计模型参数中的误差,可以使用以下事实:对于两个正态分布
A~N(m_A,v_A)
B~N(m_B,v_B)
,分布
A+B
将具有均值
m_A+m_B
,方差为
v_A+v_B
。因此,平均数的分布将是
N(总和(平均数)/N,总和(方差)/N)
。基本上,你可以说你的真实平均值是以平均值的平均值为中心,标准偏差
(sum(stddev)/sqrt(n))

我不熟悉你正在使用的特定库,但是如果你能用类似
拟合数据[-1]的东西得到拟合参数,振幅
拟合数据[-1]。平均值
,然后可以修改循环以使用以下内容:

for i in range(0, data_array.shape[0]):
    if fit_data:  # true if not an empty list
        Gauss_Model = models.Gaussian1D(amplitude=fit_data[-1].amplitude,
                                        mean=fit_data[-1].mean,
                                        stddev=fit_data[-1].stddev)
    fit_data.append(Fitting_Model(Gauss_Model, x, Data_Array[:,i]))
基本上检查是否已拟合模型,如果已拟合,则使用最新拟合的振幅、平均值和标准偏差作为下一个
高斯_模型的起点


一个想法:这可能会加快拟合速度,但不应导致每次拟合操作中100个数据点的“更好”拟合。您的结果模型可能是最适合它所呈现数据的模型。如果要估计模型参数中的误差,可以使用以下事实:对于两个正态分布
A~N(m_A,v_A)
B~N(m_B,v_B)
,分布
A+B
将具有均值
m_A+m_B
,方差为
v_A+v_B
。因此,平均数的分布将是
N(总和(平均数)/N,总和(方差)/N)
。基本上,你可以说你的真实平均值是以平均值的平均值为中心的,标准偏差
(sum(stddev)/sqrt(n))

我也不能告诉你使用的是什么库,如何做到这一点的细节可能取决于库如何存储拟合值的细节。我可以说,对于lmfit(),我们与这种用法进行了斗争,并达成了一种设计,使您尝试做的事情非常简单。使用lmfit,您可以将此问题组合为:

import numpy as np
from lmfit import GaussianModel

x = np.linspace(-50,50,100)
# get Data_Array from somewhere....

# create a model for a Gaussian
Gauss_Model = GaussianModel()

# make a set of parameters, setting initial values
params = Gauss_Model.make_params(amplitude=1000, center=0, sigma=1.0)

Fit_Results = []

for i in range(Data_Array.shape[1]):
    result = Gauss_Model.fit(Data_Array[:, i], params, x=x)
    Fit_Results.append(result)
    # update `params` with the current best fit params for the next column
    params = result.params
请注意,这是因为lmfit会小心地确保
Model.fit()
不会更改输入参数,并且会将每个拟合的结果最佳拟合参数放入
result.params

如果您决定让所有列都使用原始初始值,只需注释掉最后一个
params=result.params


Lmfit有更多的功能,但我希望这能帮助您完成所需的工作。

我也无法说出您正在使用的库,如何执行此操作的详细信息可能取决于该库存储拟合值的详细信息。我可以说,对于lmfit(),我们与这种用法进行了斗争,并达成了一种设计,使您尝试做的事情非常简单。使用lmfit,您可以将此问题组合为:

import numpy as np
from lmfit import GaussianModel

x = np.linspace(-50,50,100)
# get Data_Array from somewhere....

# create a model for a Gaussian
Gauss_Model = GaussianModel()

# make a set of parameters, setting initial values
params = Gauss_Model.make_params(amplitude=1000, center=0, sigma=1.0)

Fit_Results = []

for i in range(Data_Array.shape[1]):
    result = Gauss_Model.fit(Data_Array[:, i], params, x=x)
    Fit_Results.append(result)
    # update `params` with the current best fit params for the next column
    params = result.params
请注意,这是因为lmfit会小心地确保
Model.fit()
不会更改输入参数,并且会将每个拟合的结果最佳拟合参数放入
result.params

如果您决定让所有列都使用原始初始值,只需注释掉最后一个
params=result.params


Lmfit有更多的功能,但我希望这能帮助您完成需要的工作。

这里有一些关于这个主题的答案(尽管是在不同的程序语言和上下文中)。他们根本不回答你的问题,但也许他们可以引导你找到他们所用数学的答案?仅添加此评论是因为您的问题即将在其一周年纪念日提出。这里有一些关于这个主题的答案(尽管在不同的程序语言和上下文中)。他们根本不回答你的问题,但也许他们可以引导你找到他们所用数学的答案?仅添加此评论是因为您的问题即将在其一周年纪念日提出。