uniforme probabilidad pmf normal funciones funcion estadistica distribuciĆ³n distribucion acumulada numpy matplotlib plot scipy

numpy - probabilidad - normal en python



Ajuste al histograma de Poisson (1)

El problema con su código es que no sabe cuáles son los valores de retorno de curve_fit . Son los parámetros para la función de ajuste y su matriz de covarianza. No es algo que puedas trazar directamente.

Ajuste de los mínimos cuadrados en intervalos

En general, puedes obtener todo mucho, mucho más fácil:

import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit from scipy.misc import factorial # get poisson deviated random numbers data = np.random.poisson(2, 1000) # the bins should be of integer width, because poisson is an integer distribution entries, bin_edges, patches = plt.hist(data, bins=11, range=[-0.5, 10.5], normed=True) # calculate binmiddles bin_middles = 0.5*(bin_edges[1:] + bin_edges[:-1]) # poisson function, parameter lamb is the fit parameter def poisson(k, lamb): return (lamb**k/factorial(k)) * np.exp(-lamb) # fit with curve_fit parameters, cov_matrix = curve_fit(poisson, bin_middles, entries) # plot poisson-deviation with fitted parameter x_plot = np.linspace(0, 20, 1000) plt.plot(x_plot, poisson(x_plot, *parameters), ''r-'', lw=2) plt.show()

Este es el resultado:

Ajuste de máxima probabilidad sin intervalos

Una posibilidad aún mejor sería no usar un histograma y en su lugar hacer un ajuste de máxima probabilidad.

Pero si se examina más de cerca, incluso esto es innecesario, porque el estimador de máxima verosimilitud para el parámetro de la distribución poissoniana es la media aritmética.

Sin embargo, si tiene otros pdf más complicados, puede usar esto como ejemplo:

import numpy as np import matplotlib.pyplot as plt from scipy.optimize import minimize from scipy.misc import factorial def poisson(k, lamb): """poisson pdf, parameter lamb is the fit parameter""" return (lamb**k/factorial(k)) * np.exp(-lamb) def negLogLikelihood(params, data): """ the negative log-Likelohood-Function""" lnl = - np.sum(np.log(poisson(data, params[0]))) return lnl # get poisson deviated random numbers data = np.random.poisson(2, 1000) # minimize the negative log-Likelihood result = minimize(negLogLikelihood, # function to minimize x0=np.ones(1), # start value args=(data,), # additional arguments for function method=''Powell'', # minimization method, see docs ) # result is a scipy optimize result object, the fit parameters # are stored in result.x print(result) # plot poisson-deviation with fitted parameter x_plot = np.linspace(0, 20, 1000) plt.hist(data, bins=np.arange(15) - 0.5, normed=True) plt.plot(x_plot, poisson(x_plot, result.x), ''r-'', lw=2) plt.show()

Estoy tratando de ajustar una curva sobre el histograma de una distribución de Poisson que se parece a esto

He modificado la función de ajuste para que se parezca a una distribución de Poisson, con el parámetro t como variable. Pero la función curve_fit no se puede trazar y no estoy seguro de por qué.

def histo(bsize): N = bsize #binwidth bw = (dt.max()-dt.min())/(N-1.) bin1 = dt.min()+ bw*np.arange(N) #define the array to hold the occurrence count bincount= np.array([]) for bin in bin1: count = np.where((dt>=bin)&(dt<bin+bw))[0].size bincount = np.append(bincount,count) #bin center binc = bin1+0.5*bw plt.figure() plt.plot(binc,bincount,drawstyle= ''steps-mid'') plt.xlabel("Interval[ticks]") plt.ylabel("Frequency") histo(30) plt.xlim(0,.5e8) plt.ylim(0,25000) import numpy as np from scipy.optimize import curve_fit delta_t = 1.42e7 def func(x, t): return t * np.exp(- delta_t/t) popt, pcov = curve_fit(func, np.arange(0,.5e8),histo(30)) plt.plot(popt)