我能用Python将半高斯分布拟合到一个数据集吗?

2024-09-30 00:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试自动将高斯曲线拟合到数据中,但scipy似乎无法拟合只显示一半曲线的数据。然而,Scipy似乎无法做到这一点。你知道吗

高斯曲线数据右侧的外观: https://i.imgur.com/LwzN2Jd.png

我试过用下面的代码来拟合曲线。它适合完全弯曲。但对于半曲线,它是平的

''

plotData = {}

#x = 0,2.5,5
#y = 16766,508,600.6

modelDataDf = df.loc[:,["x","y"]]
modelDataDf.sort_values(by=["x"],inplace=True)
modelData = modelDataDf.to_dict(orient="list")


def _1gaussian(x, amp1,cen1,sigma1):
        return amp1*(1/(sigma1*(np.sqrt(2*np.pi))))*(np.exp(-((x-cen1)**2)/((2*sigma1)**2)))

x_array = np.asarray(modelData["x"])
y_array_gauss = np.asarray(modelData["y"])
amp1 = 29000
sigma1 = 1
cen1 = -1

popt_gauss, pcov_gauss = scipy.optimize.curve_fit(_1gaussian, x_array, y_array_gauss, p0=[amp1, cen1, sigma1])
perr_gauss = np.sqrt(np.diag(pcov_gauss))

plotData["xGaussCurve"] = np.arange(0, 5.05, 0.05)
plotData["yGaussCurve"] = _1gaussian(plotData["xGaussCurve"],*popt_gauss)

''

合身的样子: https://i.imgur.com/0gfqiRF.png

它卡在半高斯上: https://i.imgur.com/Jsi4fzA.png

蓝色的点表示数据,粗体的红线表示要显示的拟合,红色的虚线表示拟合失败。你知道吗

我得到一个错误:

RuntimeError:找不到最佳参数:对函数的调用数已达到maxfev=800。你知道吗

当试图拟合半高斯时。你知道吗


Tags: 数据httpscompngnparray曲线imgur
1条回答
网友
1楼 · 发布于 2024-09-30 00:25:24

如前所述,只有三个数据点就无法完全拟合高斯分布,因为参数和观测值一样多。你知道吗

但是如果你确定它是“半”高斯,那么这意味着你知道高斯的质心应该在哪里(也许在x=0或者x=-1或者其他的位置)。如果是这样的话,你可以固定质心,改变高斯函数的振幅和sigma。也许是这样的

from lmfit.models import GaussianModel

modelDataDf = df.loc[:,["x","y"]]
modelDataDf.sort_values(by=["x"],inplace=True)
modelData = modelDataDf.to_dict(orient="list")

x_array = np.asarray(modelData["x"])
y_array_gauss = np.asarray(modelData["y"])

model = GaussianModel()
params = model.make_params(amplitude=29000, sigma=1, center=-1)
params['center'].vary = False  # fix the centroid at -1

result = model.fit(y_array_gauss, params, x=x_array)
print(result.fit_report())

xplot = np.linspace(0, 5, 101)
yplot = result.eval(x=xplot)

相关问题 更多 >

    热门问题