[英]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.