Установите гауссовую функцию

У меня есть гистограмма (см. Ниже), и я пытаюсь найти среднее и стандартное отклонение вместе с кодом, который соответствует кривой моей гистограмме. Я думаю, что есть что-то в SciPy или matplotlib, которые могут помочь, но каждый пример, который я пробовал, не работает.

import matplotlib.pyplot as plt import numpy as np with open('gau_b_g_s.csv') as f: v = np.loadtxt(f, delimiter= ',', dtype="float", skiprows=1, usecols=None) fig, ax = plt.subplots() plt.hist(v, bins=500, color='#7F38EC', histtype='step') plt.title("Gaussian") plt.axis([-1, 2, 0, 20000]) plt.show() 

4 Solutions collect form web for “Установите гауссовую функцию”

Взгляните на этот ответ, чтобы подгонять произвольные кривые к данным. В основном вы можете использовать scipy.optimize.curve_fit для соответствия любой функции, которую вы хотите использовать. В приведенном ниже коде показано, как вы можете поместить гауссовские данные в некоторые случайные данные (кредит для этого списка рассылок SciPy-User).

 import numpy from scipy.optimize import curve_fit import matplotlib.pyplot as plt # Define some test data which is close to Gaussian data = numpy.random.normal(size=10000) hist, bin_edges = numpy.histogram(data, density=True) bin_centres = (bin_edges[:-1] + bin_edges[1:])/2 # Define model function to be used to fit to the data above: def gauss(x, *p): A, mu, sigma = p return A*numpy.exp(-(x-mu)**2/(2.*sigma**2)) # p0 is the initial guess for the fitting coefficients (A, mu and sigma above) p0 = [1., 0., 1.] coeff, var_matrix = curve_fit(gauss, bin_centres, hist, p0=p0) # Get the fitted curve hist_fit = gauss(bin_centres, *coeff) plt.plot(bin_centres, hist, label='Test data') plt.plot(bin_centres, hist_fit, label='Fitted data') # Finally, lets get the fitting parameters, ie the mean and standard deviation: print 'Fitted mean = ', coeff[1] print 'Fitted standard deviation = ', coeff[2] plt.show() 

Вы можете попытаться оценить модель смеси в галерее, как показано ниже:

 import numpy as np import sklearn.mixture gmm = sklearn.mixture.GMM() # sample data a = np.random.randn(1000) # result r = gmm.fit(a[:, np.newaxis]) # GMM requires 2D data as of sklearn version 0.16 print("mean : %f, var : %f" % (r.means_[0, 0], r.covars_[0, 0])) 

Ссылка: http://scikit-learn.org/stable/modules/mixture.html#mixture

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

Вид старого вопроса, но для любого, кто хочет просто построить плотность, подходящую для серии, вы можете попробовать .plot .plot(kind='kde') . Документы здесь .

Пример с пандами:

 mydf.x.plot(kind='kde') 

Я не уверен, что ваш вход, но, возможно, ваш масштаб оси Y слишком большой (20000), попробуйте уменьшить это число. Для меня работает следующий код:

 import matplotlib.pyplot as plt import numpy as np #created my variable v = np.random.normal(0,1,1000) fig, ax = plt.subplots() plt.hist(v, bins=500, normed=1, color='#7F38EC', histtype='step') #plot plt.title("Gaussian") plt.axis([-1, 2, 0, 1]) #changed 20000 to 1 plt.show() 

Редактировать:

Если вы хотите фактический подсчет значений по оси Y, вы можете установить normed=0 . И просто избавится от plt.axis([-1, 2, 0, 1]) .

 import matplotlib.pyplot as plt import numpy as np #function v = np.random.normal(0,1,500000) fig, ax = plt.subplots() # changed normed=1 to normed=0 plt.hist(v, bins=500, normed=0, color='#7F38EC', histtype='step') #plot plt.title("Gaussian") #plt.axis([-1, 2, 0, 20000]) plt.show() 
  • Локальная интерполяция более низкого порядка неявных кривых в Python
  • Использование scipy.weave.inline для быстрой 2D-медианной фильтрации
  • График нормального распределения с Matplotlib
  • Должен ли я использовать scipy.pi, numpy.pi или math.pi?
  • Повторение griddata Scipy
  • Как вычислить ошибку для полиномиального подгонки (в наклоне и перехвате)
  • Можете ли вы пропустить пиксели в изображении без загрузки всего изображения?
  • Эффективный расчет расстояния между N точками и ссылкой в ​​numpy / scipy
  • Python - лучший язык программирования в мире.