Могу ли я добавить половину гауссиана к набору данных в Python? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь автоматически подогнать гауссиан к данным, но Сципи не может подобрать данные, которые показывают только половину кривой.Однако Сципи, похоже, не может этого сделать.

как выглядит правая часть данных кривой Гаусса: 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

синие точки показывают данные, жирная красная линия показывает подгонку, которую я хочу показать, красная пунктирная линия - неудачная подгонка.

Iполучить ошибку:

RuntimeError: Оптимальные параметры не найдены: число вызовов функции достигло maxfev = 800.

При попытке подгонки к половине гауссиана.

1 Ответ

0 голосов
/ 27 июля 2019

Как прокомментировано, вы не сможете полностью уместить гауссиан только с тремя точками данных - параметров столько же, сколько наблюдений.

Но если вы уверены, что это «половина» гауссиана, то это означает, что вы знаете, где должен находиться центр тяжести гауссианы (возможно, при 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)
...