Построить гистограмму плотности выборки Бернулли и pmf Бернулли вместе

#python #matplotlib #scipy #statistics #bernoulli-probability

#python #matplotlib #scipy #Статистика #бернулли-вероятность

Вопрос:

Краткое изложение вопроса:

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

Вопрос:

Я смоделировал выборку независимых испытаний Бернулли с использованием scipy . Сейчас я пытаюсь взять гистограмму плотности образца, который я создал, и сравнить ее с pmf (функцией массы вероятности). Я ожидал бы, что гистограмма плотности покажет две ячейки, каждая из которых находится рядом с pmf, но вместо этого у меня есть 2 ячейки выше значений pmf на 5. Может кто-нибудь, пожалуйста, показать мне, как создать гистограмму плотности, которая не делает этого для Bernoulli? Я попробовал аналогичную симуляцию с несколькими другими дистрибутивами, и, похоже, она работала нормально. Чего мне здесь не хватает, и не могли бы вы показать мне, как манипулировать моим кодом, чтобы заставить это работать?

 import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

trials = 10**3
p = 0.5


sample_bernoulli = stats.bernoulli.rvs(p, size=trials) # Generate benoulli RV
plt.plot((0,1), stats.bernoulli.pmf((0,1), p), 'bo', ms=8, label='bernoulli pmf')

# Density histogram of generated values
plt.hist(sample_bernoulli, density=True, alpha=0.5, color='steelblue', edgecolor='none')
plt.show()
  

введите описание изображения здесь

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

Ответ №1:

Причина в том, что plt.hist в первую очередь предназначен для работы с непрерывными распределениями. Если вы не указываете явные границы ячеек, plt.hist просто создает 10 ячеек с равным расстоянием между минимальным и максимальным значением. Большинство этих ячеек будут пустыми. При наличии только двух возможных значений данных должно быть всего две ячейки, поэтому 3 границы:

 import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

trials = 10**3
p = 0.5

sample_bernoulli = stats.bernoulli.rvs(p, size=trials) # Generate benoulli RV
plt.plot((0,1), stats.bernoulli.pmf((0,1), p), 'bo', ms=8, label='bernoulli pmf')

# Density histogram of generated values
plt.hist(sample_bernoulli, density=True, alpha=0.5, color='steelblue', edgecolor='none', bins=np.linspace(-0.5, 1.5, 3))
plt.show()
  

пример построения

Вот визуализация границ ячеек по умолчанию и того, как образцы помещаются в ячейки. Обратите внимание, что с помощью density=True гистограмма нормализуется таким образом, что площадь всех столбцов суммируется с 1. В этом случае два столбца имеют 0.1 ширину и примерно 5.0 высоту, в то время как 8 других имеют нулевую высоту. Итак, общая площадь равна 2*0.1*5 8*0.0 = 1 .

 import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

trials = 10 ** 3
p = 0.5

sample_bernoulli = stats.bernoulli.rvs(p, size=trials)  # Generate benoulli RV

# Density histogram of generated values with default bins
values, binbounds, bars = plt.hist(sample_bernoulli, density=True, alpha=0.2, color='steelblue', edgecolor='none')
# show the bin boundaries
plt.vlines(binbounds, 0, max(values) * 1.05, color='crimson', ls=':')
# show the sample values with a random displacement
plt.scatter(sample_bernoulli * 0.9   np.random.uniform(0, 0.1, trials),
            np.random.uniform(0, max(values), trials), color='lime')
# show the index of each bin
for i in range(len(binbounds) - 1):
    plt.text((binbounds[i]   binbounds[i   1]) / 2, max(values) / 2, i, ha='center', va='center', fontsize=20, color='crimson')
plt.show()
  

показаны границы ячеек