簡體   English   中英

我可以將一半高斯擬合到Python中的數據集嗎?

[英]Can I fit half a Gaussian to a dataset in 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。

當試圖擬合一半高斯時。

如前所述,僅使用三個數據點就無法完全擬合高斯-參數與觀測值一樣多。

但是,如果您確定它是高斯的“一半”,那么這意味着您知道高斯的質心應該在哪里(也許x = 0或x = -1或其他)。 在這種情況下,您可以固定質心並改變高斯的振幅和西格瑪。 也許像

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM