2013-10-21 14 views
6

Jak mogę utworzyć histogram, który pokazuje rozkład prawdopodobieństwa danej tablicy liczb x w zakresie od 0-1? Oczekuję, że każdy pasek będzie < = 1 i jeśli zsumuję wartości y każdego słupka, powinny one sumować się do 1.Jak wykreślić funkcję masy prawdopodobieństwa w pythonie

Na przykład, jeśli x = [.2, .2, .8] to będę spodziewaj się wykresu przedstawiającego 2 słupki, jeden o wysokości 0,2 i wysokości 0,66, drugi o wysokości 0,8 i wysokości 0,33.

Próbowałem:

matplotlib.pyplot.hist(x, bins=50, normed=True) 

który daje mi histogram z barów, które wykraczają ponad 1. Nie mówię, że to źle, ponieważ to właśnie parametr Normed zrobi zgodnie z dokumentacją, ale to nie robi pokaż prawdopodobieństwa.

Próbowałem również:

counts, bins = numpy.histogram(x, bins=50, density=True) 
bins = bins[:-1] + (bins[1] - bins[0])/2 
matplotlib.pyplot.bar(bins, counts, 1.0/50) 

co daje mi również bary, których suma wartości y do większa niż 1.

Odpowiedz

3

Myślę, że moja pierwotna terminologia była wyłączona. Mam tablicę wartości ciągłych [0-1], które chcę dyskretyzować i użyć do wykreślenia funkcji masy prawdopodobieństwa. Sądziłem, że to może być dość powszechne, by uzasadnić jedną metodę.

Oto kod:

x = [random.random() for r in xrange(1000)] 
num_bins = 50 
counts, bins = np.histogram(x, bins=num_bins) 
bins = bins[:-1] + (bins[1] - bins[0])/2 
probs = counts/float(counts.sum()) 
print probs.sum() # 1.0 
plt.bar(bins, probs, 1.0/num_bins) 
plt.show() 
+1

Czy możesz wyjaśnić, dlaczego ta część jest konieczna? bin = bin [: - 1] + (bin [1] - bin [0])/2 – user3314418

3

Chyba jesteś pomylenia sumę dla integralna. Odpowiedni PRF (funkcja rozkładu prawdopodobieństwa) integruje się z jednością; jeśli po prostu weźmiesz sumę, możesz stracić na wielkości prostokąta.

import numpy as np 
import pylab as plt 

N = 10**5 
X = np.random.normal(size=N) 

counts, bins = np.histogram(X,bins=50, density=True) 
bins = bins[:-1] + (bins[1] - bins[0])/2 

print np.trapz(counts, bins) 

Daje .999985, który jest wystarczająco blisko do jedności.

EDIT: W odpowiedzi na komentarz poniżej:

Jeśli x = i szukam wykres z dwoma barami, po jednym na .2 [2, 0,2, 0,8]. z wysokością .66, ponieważ 66% wartości to .2, a jeden pasek przy .8 z wysokością .33, jaki byłby ten wykres i jak go wygenerować?

Poniższy kod:

from collections import Counter 
x = [.2,.2,.8] 
C = Counter(x) 
total = float(sum(C.values())) 
for key in C: C[key] /= total 

daje "słownika" C=Counter({0.2: 0.666666, 0.8: 0.333333}). Stąd można skonstruować wykres słupkowy, ale działałoby to tylko, gdyby plik PDF był dyskretny i pobiera tylko skończony zestaw wartości, które są dobrze oddzielone od siebie.

+0

Może moja terminologia jest wyłączony. Jeśli x = [.2, .2, .8] i szukam wykresu z dwoma taktami, jeden przy .2 z wysokością .66, ponieważ 66% wartości to .2, a jeden pasek przy .8 z wzrost .33, co by nazwać ten wykres i jak go wygenerować? – kmosley

+0

Jakie jest źródło Twoich danych? Czy pochodzi z ciągłego sygnału, czy jest zbiorem dyskretnych zdarzeń? – Hooked

+0

Jest to ciągły sygnał, który chciałbym dyskretyzować, abym mógł spojrzeć na wykres słupkowy i powiedzieć "wartości około .2 występują w przybliżeniu x% czasu". – kmosley

Powiązane problemy