Модуль random. Часть 2 | Программирование на Питоне

Модуль random. Часть 2

Все курсы > Программирование на Питоне > Занятие 10 (часть 2)

Во второй части перейдем к изучению вероятностному распределению дискретных случайных величин.

Продолжим работать в том же ноутбуке

Дискретные и непрерывные случайные величины

Случайные величины делятся на дискретные и непрерывные.

Дискретная случайная величина

Дискретная случайная величина — это случайная величина, значения которой конечны и счетны.

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

На числовой прямой такая величина может быть отмечана только на определенных точках.

дискретная случайная величина

Непрерывная случайная величина

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

На числовой прямой такая величина может принимать любое значение в пределах заданного интервала.

непрерывная случайная величина

Вероятностное распределение

А теперь давайте попробуем провести множество подсчётов (для дискретной) и измерений (для непрерывной) случайной величины и вывести их на одном графике. Начнем с дискретных величин.

Дискретное вероятностное распределение

Мы снова будем бросать игральную кость, но на этот раз существенно увеличим количество испытаний.

С помощью функции np.unique() посчитаем, сколько раз выпадет каждый из шести возможных исходов.

Теперь рассчитаем долю каждого исхода в общем количестве испытаний.

Увидеть такое распределение можно с помощью столбчатой диаграммы.

дискретное вероятностное распределение

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

Равномерное дискретное распределение

Как вы видите, вероятность наступления каждого исхода примерно одинакова. Такое распределение называется равномерным (discrete uniform distribution). Именно его и использует функция np.random.randint() при генерации чисел.

Небольшие расхождения вероятностей каждого из шести исходов объясняются тем, что мы используем эмпирическую, а не теоретическую вероятность. Теоретически эти вероятности одинаковы.

Посмотрим на нотацию равномерного распределения

$$ X \sim U(a, b) $$

В данном случае a и b — минимальное и максимальное значения случайной величины X. При бросании кости a и b равны одному и шести соответственно.

$$ X \sim U(1, 6) $$

Функция вероятности

Помимо графика, дискретное вероятностное распределение удобно описывать с помощью функции вероятности (probability mass function, pmf). Такая функция возвращает вероятность того, что случайная величина примет определенное значение.

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

$$ pmf = \frac {1}{n} $$

Параметр n можно рассчитать по формуле

$$ n = b-a+1 $$

Вероятность каждого исхода, таким образом, будет равна 1/6.

$$ pmf = \frac{1}{6-1+1} = \frac{1}{6} $$

Рассмотрим эту функцию на графике.

функция вероятности (pmf)

Функцию вероятности рассматриваемой нами дискретной величины также можно представить в форме таблицы.

таблица дискретного распределения

Еще раз обращу ваше внимание на то, что сумма вероятностей любого распределения равна единице.

Функция распределения

Одновременно, вероятностное распределение бывает удобно описать с помощью (кумулятивной, накопительной) функции распределения (cumulative distribution function, cdf). Эта функция возвращает вероятность того, что случайная величина примет значение меньше заданного. Говоря неформально, она показывает «накопившуюся» вероятность исходов.

Для равномерного дискретного распределения функция распределения выглядит следующим образом

$$ cdf(k; a, b) = \frac{[k]-a+1}{b-a+1} $$

где k — это возможный исход в границах между а и b, то есть $k \in [a, b]$.

Приведем пример. При бросании кости рассчитаем вероятность выпадения тройки или меньшего значения (то есть 1, 2 или 3).

$$ cdf(3; 1, 6) = \frac{3-1+1}{6-1+1} = \frac{3}{6} = \frac{1}{2} $$

Посмотрим на эту вероятность на графике функции распределения.

функция распределения

Математическое ожидание

Кроме того, вероятностное распределение характеризуется математическим ожиданием (expected value). Матожидание — это среднее значение (mean value) случайной величины X, взвешенное по вероятности каждого из возможных значений.

$$ {\mathbb E}[X] = \sum_{i=1}^{\infty} x_i p_i $$

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

$$ {\mathbb E}[X] = 1 \times \frac{1}{6} + 2 \times \frac{1}{6} + 3 \times \frac{1}{6} + 4 \times \frac{1}{6} + 5 \times \frac{1}{6} + 6 \times \frac{1}{6} = 3.5 $$

Для равномерного распределения есть и сокращенная формула.

$$ {\mathbb E}[X] = \frac{a+b}{2} = \frac{1+6}{2} = 3.5 $$

На Питоне мы можем сложить результаты поэлементного умножения.

Кроме того, можно использовать скалярное произведение.

Посмотрим на среднее значение сгенерированного распределения.

Дисперсия

Еще одной характеристикой вероятностного распределения является дисперсия (variance). Для равномерного распределение она вычисляется по следующей формуле.

$$ {\mathbb D}[X] = \frac{n^2-1}{12} $$

В нашем случае дисперсия равна

$$ {\mathbb D}[X] = \frac{6^{2}-1}{12} = \frac{35}{12} \approx 2,917 $$

Сравним с нашим распределением

Впрочем, далеко не все дискретные распределения равномерны. Посмотрим на распределение Бернулли.

Распределение Бернулли

Многие случайные процессы характеризуются только двумя исходами. Это и выпадение орла или решки при подбрасывании монет, и успех или неудача клинического испытания. Такие процессы можно моделировать с помощью распределения Бернулли (Bernulli distribution).

Давайте рассмотрим этот процесс на практике. На этот раз мы будем подбрасывать монету, но не обычную или «честную монету», а такую, в которой вероятность выпадения орла (обозначим ее p) равна 0,7, а вероятность решки — 0,3. После каждого подбрасывания запишем получившийся результат.

В Numpy нет отдельной функции для распределения Бернулли, поэтому напишем собственную функцию.

В следующей главе я покажу, как можно использовать функцию биномиального распределения для имитации эксперимента Бернулли.

  • Объявим функцию bernoulli() с двумя параметрами, p и iter. Первый параметр будет отвечать за выпадение орла, второй — за количество подбрасываний.
  • С помощью функции np.random.rand() мы будем генерировать значение непрерывной равномерной величины (об этом опять же чуть ниже) и если получившееся значение меньше p, мы запишем, что выпал орел, в противном случае, что решка.

Посмотрим на реализацию на Питоне.

Вызовем эту функцию с параметрами p и iter, равными 0,7 и 10000 соответственно.

Посмотрим на распределение Бернулли на графике. Воспользуемся столбчатой диаграммой.

распределение Бернулли

Биномиальное распределение

Пример с одинаковой вероятностью

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

Обозначим орла через H (head), а решку через T (tail).

биномиальное распределение

Вероятность каждой из комбинаций равна 1/8, так как при одном подбрасывании вероятность выпадения орла или решки одинакова (монета симметрична, fair coin).

$$ P = \frac{1}{2} \times \frac{1}{2} \times \frac{1}{2} = \frac{1}{8} $$

Какова вероятность выпадения двух орлов (вне зависимости от порядка, в котором они выпадали)? Вначале нам нужно посмотреть, в скольких комбинациях оказалось два орла (назовем такие испытания «успехами», successes).

вероятности биномиального распределения

Таких комбинаций три (HHT, HTH, THH). Осталось количество «успехов» умножить на вероятность каждого исхода.

$$ P(X = 2) = 3 \times \frac{1}{8} = \frac{3}{8} $$

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

$$ P(X = 0) = \frac{1}{8} $$

Вероятность одного и трех орлов после трех испытаний равна

$$ P(X = 1) = 3 \times \frac{1}{8} = \frac{3}{8} $$

$$ P(X = 3) = \frac{1}{8} $$

Для полноты картины замечу, что, например, P(X = 3) читается как вероятность (P) того, что случайная величина (X) примет значение три.

Теперь давайте выведем эти вероятности на график. По оси x разместим возможные значения случайной величины X, а по оси y соответствующие вероятности P(X = x). У нас получился график биномиального распределения.

биномиальное распределение с одинаковой вероятностью (гистограмма)

Таким образом, биномиальное распределение (binomial distribution) показывает вероятность количества успехов каждой из возможных комбинаций исходов в серии одинаковых независимых испытаний Бернулли.

Пример с разной вероятностью

Давайте немного изменим условия эксперимента. На этот раз монета будет неправильной или несимметричной (biased coin) и вероятность выпадения орла составит 0,7, а решки — 0,3. Построим дерево вероятностей (tree diagram).

биномиальное распределение с разной вероятностью

Обратите внимание, несимметричность монеты повлияла на результат. Рассчитаем вероятности выпадения одного и двух орлов.

$$ P(X = 1) = 3 \times 0,063 = 0,189 $$

$$ P(X = 2) = 3 \times 0,147 = 0,441 $$

Аналогично рассчитаем вероятность, что орел вообще не выпал и что выпали только орлы.

$$ P(X = 0) = 0,027 $$

$$ P(X = 3) = 0,343 $$

Построим такое биномиальное распределение на графике.

биномиальное распределение с разной вероятностью (гистограмма)

Обратите внимание, распределение несимметрично с более пологой частью слева. Еще говорят, что распределение скошено влево (skewed left). Если бы вероятность выпадения орла была 0,3, а решки — 0,7, то распределение имело бы обратную форму и было скошено вправо (skewed right).

Формула биномиального распределения

Пока мы бросали монету по три раза, то вероятность любой комбинации исходов несложно посчитать с помощью дерева вероятностей. При этом если подбрасывать, например, 10 раз, количество вариантов достигнет 210 = 1024. Для такого распределения понадобится формула.

Возможно вы обратили внимание, что для выведения формулы нам нужно два компонента:

  1. количество возможных комбинаций
  2. вероятность каждой из них

Количество каждой из возможных комбинаций можно найти с помощью треугольника Паскаля. Например, при трех подбрасываниях (n = 3), мы видим, что количество возможных комбинаций будет равно {1, 3, 3, 1}, что соответствует нашему дереву вероятностей.

треугольник Паскаля

Можно также воспользоваться формулой биномиальных коэффициентов, в которой через n мы обозначим количество подбрасываний, а через k — количество «успехов» (выпадений орлов).

$$ \binom{n}{k} = \frac{n!}{k!(n-k)!} $$

Например, убедимся, что выпадение двух орлов (k = 2) при трех подбрасываниях (n = 3) возможно в трех комбинациях.

$$ \binom{3}{2} = \frac{3!}{2!(3-2)!} = 3 $$

Одновременно, нам нужно понимать вероятность каждой комбинации. Ее можно рассчитать по формуле

$$ p^k (1-p)^{n-k} $$

В данном случае мы возводим вероятность успеха (p) в степень количества успехов (k) и вероятность неудачи (1−p) в степень количества неудач (n−k). Например, если вероятность выпадения орла (p) равна 0,7, то вероятность выпадения двух орлов (k = 2) в трех бросках (n = 3) равна

$$ 0,7^2 (1-0,7)^{3-2} = 0,49 \times 0,3 = 0,147 $$

Остается перемножить количество комбинаций и вероятность каждой из них

$$ P(X = 2) = 3 \times 0,147 = 0,441 $$

Таким образом, вся формула целиком выглядит так

$$ P(X = k) = \binom{n}{k} p^k (1-p)^{n-k} $$

Эта же формула описывает функцию вероятности (probability mass function, pmf) биномиального распределения.

Матожидание и дисперсия

Матожидание рассчитывается по формуле

$$ {\mathbb E}[X] = np $$

Например, после трех бросков мы можем ожидать, что в среднем орел выпадет 3 x 0,7 = 2,1 раза. Дисперсию можно рассчитать через

$$ {\mathbb D}[X] = np(1-p) \rightarrow {\mathbb D}[X] = 3 \times 0,7 \times (1-0,7) = 0,63 $$

Биномиальное распределение на Питоне

Выполним эти же расчеты с помощью Питона. Функция np.random.binomial() принимает три параметра:

  • n — количество испытаний в одном эксперименте (например, подбрасываний монеты)
  • p — вероятность успеха (например, выпадения орла)
  • size — количество экспериментов (серий по n подбрасываний)

Теперь посмотрим, сколько раз выпали ноль, один, два или три орла и рассчитаем относительную частоту каждого из значений.

Как вы видите, при достаточно большом количестве экспериментов эмпирическая вероятность приблизилась к рассчитанной выше теоретической вероятности.

Посмотрим на распределение на графике.

биномиальное распределение на Питоне

Рассчитаем среднее значение и дисперсию.

Дополнительно, как и обещал, покажу как можно повторить эксперимент Бернулли с помощью функции np.random.binomial(). Для этого достаточно указать параметр n = 1 (то есть только одно подбрасывание).

Выведем распределение на графике.

распределение Бернулли на Питоне

Существуют и другие дискретные вероятностные распределения, например, геометрическое распределение или распределение Пуассона. Теперь перейдем к вероятностным распределениям непрерывной случайной величины.