2011-10-25 30 views
5

Sto prelevando alcuni campioni da un exponential distribution. Nel mio primo esperimento, sto disegnando 1000 campioni e per il secondo, sto disegnando 10.000 campioni da questa distribuzione. (con numpy.random.exponential)Come posso calcolare la massima stima di probabilità in Python

Mi piacerebbe confrontare visivamente la differenza della stima della massima verosimiglianza dei miei due esperimenti. (poiché questa è una distribuzione esponenziale, l'MLE sarà solo una media campionaria, quindi con il mio secondo esperimento, l'MLE dovrebbe essere più vicino alla densità reale).

Come posso fare un confronto in Python? So come plasmare la grafica in matplotlib, ma qui non so quale tipo di grafica dovrei usare.

+3

Non credo di aver capito. Hai due MLE. Questo è due numeri. Non ci sono molte informazioni che puoi ottenere con un grafico invece di guardare solo i numeri. In alternativa, è possibile calcolare gli MLE per un gruppo di dimensioni del campione e dimensione del grafico rispetto a MLE. Quindi confrontalo con il valore reale. * Questo * potrebbe essere migliore. – Avaris

+0

Ci scusiamo per la confusione. Voglio tracciare qualcosa del genere: http://nipy.sourceforge.net/nitime/_images/ar_est_2vars_01.png. Voglio mostrare la densità reale e le mie versioni stimate. –

+0

C'è ancora confusione, ma penso che riguardi la matematica. Si suppone che MLE fornisca una stima per una * variabile singola *, non una densità. Ma per una distribuzione esponenziale, è possibile utilizzare la stima della media per ottenere una * densità di stima *, poiché esiste una relazione diretta tra il parametro della media e la densità. E 'questo quello che cercavi? – Avaris

risposta

4

Tenuto conto delle osservazioni nei commenti, credo che qualcosa di simile a quanto segue è quello che stai cercando:

import numpy as np 
import matplotlib.pyplot as plt 

def plot_exponential_density(mu, xmax, fmt, label): 
     x = np.arange(0, xmax, 0.1) 
     y = 1/mu * np.exp(-x/mu) 
     plt.plot(x, y, fmt, label=label) 

def sample_and_plot(N, color): 
     # first sample N valus 
     samples = np.zeros((N,1)) 
     for i in range(0,N): 
       samples[i] = np.random.exponential() 

     # determine the mean 
     mu = np.mean(samples) 
     print("N = %d ==> mu = %f" % (N, mu)) 

     # plot a histogram of the samples 
     (n, bins) = np.histogram(samples, bins=int(np.sqrt(N)), density=True) 
     plt.step(bins[:-1], n, color=color, label="samples N = %d" % N) 

     xmax = max(bins) 

     # plot the density according to the estimated mean 
     plot_exponential_density(mu, xmax, color + "--", label="estimated density N = %d" % N) 

     return xmax 


# sample 100 values, draw a histogram, and the density according to 
# the estimated mean 
xmax1 = sample_and_plot(100, 'r') 
# do the same for 1000 samples 
xmax2 = sample_and_plot(10000, 'b') 

# finally plot the true density 
plot_exponential_density(1, max(xmax1, xmax2), 'k', "true density") 

# add a legend 
plt.legend() 

# and show the plot 
plt.show() 

enter image description here

ho usato 100 e 10.000 campioni, dal momento che con 1.000 campioni della stima è già abbastanza buono Ma ancora con solo 100 campioni sono in qualche modo sorpreso di quanto sia buona la stima della media e quindi della densità. Dato solo l'istogramma senza la consapevolezza che i campioni sono tratti da una distribuzione esponenziale, non sono sicuro di riconoscere una distribuzione esponenziale qui ...

Problemi correlati