Matplotlib: Как преобразовать гистограмму в функцию дискретной вероятностной массы?

У меня есть вопрос относительно функции hist () с matplotlib.

Я пишу код для построения гистограммы данных, значение которой варьируется от 0 до 1. Например:

values = [0.21, 0.51, 0.41, 0.21, 0.81, 0.99] bins = np.arange(0, 1.1, 0.1) a, b, c = plt.hist(values, bins=bins, normed=0) plt.show() 

Приведенный выше код генерирует правильную гистограмму (я не мог опубликовать изображение, так как у меня недостаточно репутации). С точки зрения частот это выглядит так:

 [0 0 2 0 1 1 0 0 1 1] 

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

 [ 0. 0. 0.333333333 0. 0.166666667 0.166666667 0. 0. 0.166666667 0.166666667 ] # each item in the previous array divided by 6) 

Я думал, что мне просто нужно изменить параметр в функции hist () на «normed = 1». Тем не менее, я получаю следующие частоты гистограммы:

 [ 0. 0. 3.33333333 0. 1.66666667 1.66666667 0. 0. 1.66666667 1.66666667 ] 

Это не то, что я ожидаю, и я не знаю, как получить дискретную функцию массовой вероятности, сумма которого должна быть равна 1.0. Аналогичный вопрос задавали по следующей ссылке ( ссылка на вопрос ), но я не думаю, что этот вопрос был решен.

Я ценю за вашу помощь заранее.

2 Solutions collect form web for “Matplotlib: Как преобразовать гистограмму в функцию дискретной вероятностной массы?”

Причиной является norm=True дает функцию плотности вероятности . В теории вероятностей, функции плотности вероятности или плотности непрерывной случайной величины описывает относительный правдоподобие для данной случайной величины принимать заданное значение.

Рассмотрим очень простой пример.

 x=np.arange(0.1,1.1,0.1) array([ 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]) # Bin size bins = np.arange(0.05, 1.15, 0.1) np.histogram(x,bins=bins,normed=1)[0] [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.] np.histogram(x,bins=bins,normed=0)[0]/float(len(x)) [ 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] # Change the bin size bins = np.arange(0.05, 1.15, 0.2) np.histogram(x,bins=bins,normed=1)[0] [ 1., 1., 1., 1., 1.] np.histogram(x,bins=bins,normed=0)[0]/float(len(x)) [ 0.2, 0.2, 0.2, 0.2, 0.2] 

Как видно из вышесказанного, вероятность того, что x будет находиться между [0.05-0.15] или [0.15-0.25] равна 1/10 тогда как если вы измените размер ячейки до 0.2 то вероятность того, что она будет находиться между [0.05-0.25] или [0.25-0.45] составляет 1/5 . Теперь эти фактические значения вероятности зависят от размера бункера, однако плотность вероятности не зависит от размера бункеров. Таким образом, это единственный правильный способ сделать это, иначе нужно было бы указать ширину бина в каждом графике.

Поэтому в вашем случае, если вы действительно хотите построить значение вероятности в каждом бункере (а не плотность вероятности), вы можете просто разделить частоту каждой гистограммы на количество общих элементов. Однако я бы предложил вам не делать этого, если вы не работаете с дискретными переменными, и каждый из ваших ящиков представляет собой одно возможное значение этой переменной.

Построение функции непрерывной вероятности (PDF) из гистограммы – Решено на Python. обратитесь к этому блогу для подробного объяснения. ( http://howdoudoittheeasiestway.blogspot.com/2017/09/plotting-continuous-probability.html ) Иначе вы можете использовать приведенный ниже код.

 n, bins, patches = plt.hist(A, 40, histtype='bar') plt.show() n = n/len(A) n = np.append(n, 0) mu = np.mean(n) sigma = np.std(n) plt.bar(bins,n, width=(bins[len(bins)-1]-bins[0])/40) y1= (1/(sigma*np.sqrt(2*np.pi))*np.exp(-(bins - mu)**2 /(2*sigma**2)))*0.03 plt.plot(bins, y1, 'r--', linewidth=2) plt.show() 
  • Python Matplotlib Неправильная ориентация колчана
  • Отобразить изображение с масштабированием = 1 с помощью Matplotlib imshow () (как?)
  • ValueError: неверный литерал для int () с базой 10 в тензорном потоке
  • Как построить несколько гистограмм на одном и том же участке с морским коньком
  • Установить размер переменной точки в matplotlib
  • Чтобы получить правильную ориентацию контура и сохранить графики как отдельные изображения при создании в цикле?
  • Построение диаграммы данных повышает погрешность порядкового значения должно быть> = 1
  • Как я могу экспортировать метки маркеров из matplotlib по одному за раз?
  • Легенда сюжета Python: маркеры появляются дважды
  • Как добавить вторую ось x в matplotlib
  • Загрязнение памяти Python matplotlib (не очистка)
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.