Ajustement à l'histogramme de Poisson

j'essaie d'ajuster une courbe sur l'histogramme d'une distribution de Poisson qui ressemble à ceci histo

j'ai modifié la fonction fit pour qu'elle ressemble à une distribution de Poisson, avec le paramètre t comme variable. Mais la fonction curve_fit ne peut pas être tracée et je ne sais pas pourquoi.

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)
17
demandé sur ROBOTPWNS 2014-09-14 02:05:26

1 réponses

le problème avec votre code est que vous ne savez pas quelles sont les valeurs de retour de curve_fit. Il s'agit des paramètres de la fonction d'ajustement et de leur matrice de covariance. Pas quelque chose que vous pouvez tracer directement.

Mise À La Poubelle Des Moindres Carrés De L'Ajustement

en général, vous ne pouvez pas obtenir tout beaucoup, beaucoup plus facile:

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

C'est le résultat: poisson fit

ajustement de vraisemblance maximale non lié

une possibilité encore meilleure serait de ne pas utiliser un histogramme à tous et à la place de faire un ajustement de vraisemblance maximum.

mais en y regardant de plus près, même cela n'est pas nécessaire, parce que le estimateur de vraisemblance maximale pour le paramètre de la distribution poissonienne est la moyenne arithmétique.

cependant, si vous avez d'autres fichiers PDF plus compliqués, vous pouvez utiliser ceci comme exemple:

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()
38
répondu MaxNoe 2015-06-12 10:33:43