Установите гауссовую функцию
У меня есть гистограмма (см. ниже), и я пытаюсь найти среднее и стандартное отклонение вместе с кодом, который соответствует кривой моей гистограмме. Я думаю, что есть что-то в 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()
Ответы
Ответ 1
Взгляните на этот ответ для подгонки произвольных кривых к данным. В принципе вы можете использовать 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, i.e. the mean and standard deviation:
print 'Fitted mean = ', coeff[1]
print 'Fitted standard deviation = ', coeff[2]
plt.show()
Ответ 2
Вы можете попробовать оценить размер модели гауссовой модели sklearn, как показано ниже:
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
Обратите внимание, что таким образом вам не нужно оценивать распределение образца с помощью гистограммы.
Ответ 3
Вид старого вопроса, но для любого, кто хочет просто построить плотность, подходящую для серии, вы можете попробовать matplotlib .plot(kind='kde')
. Docs здесь.
Пример с pandas:
mydf.x.plot(kind='kde')
Ответ 4
Я не уверен, что ваш вход, но, возможно, слишком большой масштаб оси 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()
Edit:
Если вам нужен фактический счетчик значений по оси 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()