Попытка приспособить функцию Гаусса к данным - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь согласовать некоторые данные, которые приблизительно гауссовы, с функцией в python, используя метод curve_fit. Для начальных предположений параметров я вычислил среднее значение и стандартное отклонение данных. Тем не менее, я очень плохо себя чувствую и не знаю почему. Это мой код:

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
import math

def func(x, mu, sig):
    return (1./(sig*math.sqrt(2*math.pi)))*np.exp(-np.power(x-mu,2.)/(2*np.power(sig, 2.)));

xdata = np.linspace(4, 14, 21)
ydata = np.array([0.2,0.8,1.8,1.9,5.9,7,11,12.6,14,13.3,11.8,9.3,5.2,3.1,1.5,0.7,0.4,0.1,0.3,0.1,0.1])
plt.plot(xdata, ydata, 'b-', label='data')

popt, pcov = curve_fit(func, xdata, ydata,[4.8,5.1])
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')

Встроенная модель (красного цвета) выглядит следующим образом: введите описание изображения здесь

1 Ответ

0 голосов
/ 18 февраля 2020

Причина, по которой вы получаете бессмысленный ответ, заключается в том, что вы пытаетесь подогнать гауссову функцию нормализованной кривой. Смотрите разницу здесь .

Вместо этого, если вы используете обобщенную форму с 3 параметрами, вы получите намного лучшее соответствие.

def generalised_gaussian(x, a, b, c):
    return a*np.exp(-np.power((x-b)/(2*c**2), 2))

xdata = np.linspace(4, 14, 21)
ydata = np.array([0.2,0.8,1.8,1.9,5.9,7,11,12.6,14,13.3,11.8,9.3,5.2,3.1,1.5,0.7,0.4,0.1,0.3,0.1,0.1])
plt.plot(xdata, ydata, 'b-', label='data')

popt, pcov = curve_fit(generalised_gaussian, xdata, ydata)
plt.plot(xdata, generalised_gaussian(xdata, *popt), 'r-', label='fit')

Fit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...