Построение случайных чисел из заданного распределения вместе с их ожидаемым значением в Python - PullRequest
3 голосов
/ 08 марта 2020

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

В настоящее время я использую matplotlib для построения графиков и numpy для выборки.

Я нашел рабочий пример того, чего я пытаюсь достичь

# read mu, sigma, n
x = np.random.normal(mu, sigma, n)
count, bins, ignored = plt.hist(x, bins="auto", density=True)
plt.plot(bins, 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-(bins - mu) ** 2 / (2 * sigma ** 2)), linewidth=2, color='r')
plt.show()

Итак, x - это образец массива, и они строят его с помощью гистограмм, и они используют фактический pdf для функции.

Как это работает, например, для биномиального распределения? Я следовал аналогичной схеме:

x = np.random.binomial(N, P, n)
count, bins, ignored = plt.hist(x, bins="auto", density=True)
plt.plot(bins, scipy.special.comb(N, bins) * (P ** bins) * ((1 - P) ** (N - bins)), linewidth=2, color='r')
plt.show()

Однако график, который я получаю, на самом деле выглядит не так:

graph

Что ж, высота PDF не соответствует гистограмме. Что я делаю неправильно? Это биноминальная функция?

Ответы [ 3 ]

1 голос
/ 08 марта 2020

Я думаю, вы поняли это правильно. Ваша формула для PDF выглядит правильно. Попробуйте это с гораздо большим количеством образцов (n) из вашего бинома. Напомним, площадь под PDF интегрируется в 1,0. При использовании density=True ваша гистограмма также нормализуется, что хорошо. Что происходит, когда у вас недостаточно большой n? У вас есть пустые корзины ... а остальные относительно выше.

Я запустил ваш код для N = 1000, P = 0,7, n = 10000 и получил приличный график. E [X] = 700 для этого. Участок выглядит достаточно разумно ...

enter image description here

0 голосов
/ 08 марта 2020

Я не был полностью уверен, почему вы пытались оценить PDF на основе возвращаемых параметров из функции hist, но это можно изобразить, просто используя scipy's binom.pmf (функция вероятности, дискретный эквивалент PDF):

N, P = 100, 0.5
f, ax1 = plt.subplots(figsize=(10, 5))
x = np.random.binomial(N, P, 50000)
count, bins, ignored = ax1.hist(x, bins="auto")
ax2 = ax1.twinx()
ax2.plot(range(100), binom.pmf(range(100), n=N, p=P))
ax2.grid(None)
plt.show()

Вывод:

enter image description here

(я спрятал сетку во втором ax, потому что два Оси Y не совсем выровнены, на основе this .)

0 голосов
/ 08 марта 2020

В bins = "auto" по умолчанию используется метод sturges, который учитывает только размер данных. Это хорошо только для гауссовых данных и недооценивает количество бинов для больших негауссовых наборов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...