Как построить функцию массы вероятности в python

Как я могу создать гистограмму, которая показывает распределение вероятностей, заданное массивом чисел x в диапазоне от 0-1? Я ожидаю, что каждый бар будет

например, если x=[.2, .2, .8] тогда я ожидал бы график, показывающий 2 бара, один на .2 с высотой .66, один на .8 с высоты .33.

Я пробовал:

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

что дает мне гистограмму с барами, которые идут выше 1. Я не говорю это неправильно, так как это то, что будет делать нормированный параметр согласно документации, но это не показывает вероятности.

Я тоже пробовал:

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)

что также дает мне бары, значения y которых составляют сумму больше 1.

2 ответов


Я думаю, что моя оригинальная терминология была выключена. У меня есть массив непрерывных значений [0-1), которые я хочу дискретизировать и использовать для построения функции массы вероятности. Я думал, что это может быть достаточно распространенным, чтобы оправдать один метод для этого.

вот код:

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

Я думаю, вы ошибаетесь sum на Интеграл. Правильный PRF (функция распределения вероятности) интегрируется в unity; если вы просто берете сумму, вы можете пропустить размер прямоугольника.

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)

дает .999985, что достаточно близко к единству.

EDIT: в ответ на комментарий ниже:

если x=[.2, .2, .8] и я ищу график с двумя барами, один на .2 с высота.66 потому что 66% значений at .2 и один бар .8 с высоты .33, Что бы что графа будет называться и как мне создать его?

следующий код:

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

дает "словарь" C=Counter({0.2: 0.666666, 0.8: 0.333333}). Отсюда можно построить гистограмму, но это будет работать только в том случае, если PDF дискретные и занимает только конечный фиксированный набор значений, которые хорошо отделены друг от друга.