Как построить функцию массы вероятности в 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 дискретные и занимает только конечный фиксированный набор значений, которые хорошо отделены друг от друга.