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