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 una curva a mi histograma. Creo que hay algo en SciPy o matplotlib que puede ayudar, pero cada ejemplo que he probado 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()
  • ¿Qué quieres decir con que no funciona? No se ejecuta, o la salida no es correcta?
  • No puedo obtener el código de la internet para trabajar, para hacer realidad una curva como la que se supone que
  • lo que es más probable que ocurra porque acabo de empezar la programación y generalmente tengo ni idea de lo que estoy haciendo
  • Así que usted está recibiendo un mensaje de error cuando intenta ejecutar? O ¿el programa completo sin producir nada?
  • Yo no sé la manera correcta de hacer el trabajo con mis datos
InformationsquelleAutor | 2012-07-16

4 Comentarios

  1. 38

    Echa un vistazo a esta respuesta para el ajuste de curvas arbitrarias a los datos. Básicamente, usted puede utilizar scipy.optimizar.curve_fit para adaptarse a cualquier función que se desee que sus datos. El código siguiente muestra cómo puede un ajuste Gaussiano a algunos datos aleatorios (el crédito este SciPy-lista de correo de usuarios de correos).

    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()
    • gracias, esta obtuvo la media y sd bien, pero la curva de ajuste en realidad no produce una curva, se produce una de las líneas de
    • ¿Te refieres a mi ejemplo solo produce líneas? O cuando se aplique el código anterior para que sus datos usted obtener líneas? También, ¿cuál es la diferencia entre una recta y una curva?
    • como contraposición a la curva de la campana de tipo de forma, sólo se ve como una zanahoria ^
    • Sin más información que yo no puedo ayudarle. ¿Quieres decir que se parece a una zanahoria con tus datos? Si es así, entonces probablemente lo es porque eso es lo que parece que sus datos similares. Cuando preguntas lo mejor es incluir un corto, autónomo ejemplo.
    • Sospecho que @user1496646 significa que, en su caso, no hay muchos <bin_centres>, por lo que cuando la trama(bin_centres, hist_fit), sale mal muestreados Gaussiano («zanahoria»). Él sólo debe submuestra de la bin_centers, utilizando new_bin_centers = numpy.linspace(bin_centres[0], bin_centres[-1], 200), new_hist_fit = gauss(new_bin_centres, *coef) y la trama(new_bin_centres, new_hist_fit)
  2. 13

    Puede intentar sklearn mezcla gaussiana del modelo de estimación de la siguiente manera :

    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, usted no necesita una estimación de su distribución de muestras con un histograma.

  3. 2

    Tipo de una vieja pregunta, pero para aquellos que buscan sólo para graficar una densidad de ajuste para una serie, usted podría tratar de matplotlib del .plot(kind='kde'). Docs aquí.

    Ejemplo con los pandas:

    mydf.x.plot(kind='kde')
    • wow, HASTA matplotlib tiene estimación de densidad de kernel incorporado. +1
  4. 0

    No estoy seguro de lo que su entrada es, pero posiblemente tu escala del eje y es demasiado grande (20000), pruebe a reducir este número. El siguiente código me funciona:

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

    Edición:

    Si quieres el recuento real de los valores en el eje y, se puede establecer normed=0. Y acaba de deshacerse de la 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()
    • no estoy trabajando con más de la mitad de un millón de puntos por lo que la balanza se que ya no me quiere como a 50.000 contenedores
    • cree que el valor en el eje-y no indica el número de observaciones en cada intervalo, se dice que el porcentaje en cada bin. Sólo un comentario fuera de toda plt.axis([-1, 2, 0, 1]) línea y la ejecución, usted debe obtener una gráfica de distribución.
    • definitivamente me dice el número en cada contenedor, ya que puedo ver el histograma de la misma con el eje y en 20.000
    • Downvoter, puede usted por favor explique la razón por la downvote?

Dejar respuesta

Please enter your comment!
Please enter your name here