2011-10-25 14 views
5

Rysuję niektóre próbki z exponential distribution. W pierwszym eksperymencie pobieram 1000 próbek, a po drugie, pobieram 10 000 próbek z tej dystrybucji. (z numpy.random.exponential)Jak wykreślić maksymalne prawdopodobieństwo oszacowania w Pythonie

Chciałbym wizualnie porównać różnicę maksymalnego prawdopodobieństwa oszacowania moich dwóch eksperymentów. (ponieważ jest to rozkład wykładniczy, MLE będzie po prostu średnią próbką, więc przy moim drugim eksperymencie MLE powinien być bliższy rzeczywistej gęstości).

Jak mogę zrobić takie porównanie w Pythonie? Wiem, jak rysować grafiki w matplotlib, ale tutaj nie wiem, jakiego rodzaju grafiki powinienem użyć.

+3

Nie sądzę, że rozumiem. Masz dwa MLE's. To są dwie liczby. Nie ma zbyt wielu informacji, które można uzyskać za pomocą wykresu, a nie tylko na samych liczbach. Alternatywnie możesz obliczyć MLE dla kilku wielkości próbek i rozmiaru wykresu w porównaniu do MLE. Następnie porównaj ją z rzeczywistą wartością. * To * może być lepsze. – Avaris

+0

Przepraszamy za zamieszanie. Chcę wykreślić coś takiego: http://nipy.sourceforge.net/nitime/_images/ar_est_2vars_01.png. Chcę pokazać prawdziwą gęstość i moje szacowane wersje. –

+0

Ciągle jest zamieszanie, ale myślę, że chodzi o matematykę. MLE ma dać ci oszacowanie * zmiennej pojedynczej *, a nie gęstości. Ale w przypadku rozkładu wykładniczego można użyć oszacowania średniej, aby uzyskać * gęstość szacunkową *, ponieważ istnieje prosta relacja między średnią a parametrem gęstości. Czy tego właśnie szukasz? – Avaris

Odpowiedz

4

Biorąc pod uwag w komentarzach, chyba coś po to, czego szukasz:

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

użyłem 100 i 10000 próbek, ponieważ z 1000 próbek oszacowanie jest już całkiem niezły. Ale wciąż z zaledwie 100 próbkami jestem nieco zaskoczony, jak dobre jest oszacowanie średniej, a tym samym gęstości. Biorąc pod uwagę tylko histogram bez wiedzy, że próbki są pobierane z rozkładu wykładniczego, nie jestem pewien, czy rozpoznałbym wykładniczy rozkład tutaj ...