versiones guia español descargar actualizar python matplotlib scipy histogram curve-fitting

python - guia - qgis manual



Ajustar una función gaussiana (4)

Eche un vistazo a esta respuesta para ajustar curvas arbitrarias a los datos. Básicamente, puede usar scipy.optimize.curve_fit para adaptar cualquier función que desee a sus datos. El código a continuación muestra cómo puedes adaptar un gaussiano a algunos datos aleatorios (crédito para this publicación de la lista de correo de usuarios de SciPy).

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()

Tengo un histograma (ver más abajo) y estoy tratando de encontrar la media y la desviación estándar junto con el código que se ajusta a la curva de mi histograma. Creo que hay algo en SciPy o matplotlib que puede ayudar, pero cada ejemplo que probé no funciona.

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()


No estoy seguro de cuál es su opinión, pero posiblemente su escala del eje y sea demasiado grande (20000), intente reducir este número. El siguiente código funciona para mí:

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()

Editar:

Si desea el recuento real de valores en el eje y, puede establecer normed=0 . Y simplemente se desharía del 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()


Puede probar la estimación del modelo Sklearn Gaussian Mix como se muestra a continuación:

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]))

Referencia: http://scikit-learn.org/stable/modules/mixture.html#mixture

Tenga en cuenta que de esta manera, no necesita estimar la distribución de su muestra con un histograma.


Una especie de pregunta antigua, pero para cualquiera que busque trazar un ajuste de densidad para una serie, puedes probar el argumento de .plot(kind=''kde'') . Docs here

Ejemplo con pandas:

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