Как найти вероятность питон

Привет, Хабр! Я очень долго собирался с мыслями, чтобы попробовать опубликовать свою статью в вашем сообществе, это дебют, поэтому буду рад услышать в комментариях обратную связь по поводу содержимого материала. Тематика сегодняшнего сообщения – это разбор базовых понятий в теории вероятностей с помощью языка программирования Python.

Прежде чем приступить к изложению базовых понятий немного расскажу о себе, о профессиональном опыте, чтобы вы могли иметь представление об авторе. Я окончил Уральский Федеральный Университет по направлению бизнес-информатика и сейчас работаю младшим научным сотрудником в Институте экономики Уральской Академии наук (г. Екатеринбург). В основном направление, по которому я обучался, опиралось на моделировании бизнес процессов. Было конечно немного статистики и теории вероятностей, но по мере своего профессионального роста знаний, полученных в университете, мне оказалось недостаточно, поэтому сейчас я вспоминаю изученный материал и постепенно изучаю новый. В качестве такого своеобразного отчёта о проделанной работе принял решение публиковать небольшие статьи здесь. Надеюсь для новичков, которым собственно я и являюсь по сегодняшний день данный материал будет полезен.

За основу для изучения взял оксфордский учебник на английском языке «Bayesian Statistics for Beginners» (автор Therese M и Ruth M.Mickey). Если у вас есть какие-то базовые знания по математике, которые вы хотите углубить или вспомнить данная книга как раз для вас. Мне очень понравилось её необычное изложение в форме интервью, достаточно простой английский (для уровня B1-B2). Думаю, если вы часто читаете документацию на английском языке или ещё лучше научную литературу, учебник можно осилить практически без словаря. Сама книга – цветная, читать формулы – одно удовольствие. В общем зарекомендовал как мог.

Далее расскажу об опыте изучения литературы, потому что считаю для кого-то это очень важным. Чтение книги я разбил в три этапа.

1.     Обзорное чтение (сюда включается перевод терминов, слов, выражений)

2.     Конспектирование (очень полезный инструмент для осознания материала)

Это тот самый конспект

Это тот самый конспект

3.     Публикация в Хабре (рефлексия, принятие материала, разработка программного кода для лучшего понимания алгоритмов в теории вероятности)

4.     Получение обратной связи от участников сообщества.

На изучение книги ушло около 4 месяцев (с ноября 2021 года по март 2022 года). Думаю, после этого короткого введения можно начать описывать обзор прочитанного. Ах, чуть не забыл в начале каждой статьи я буду публиковать примерный её содержательный план, к которому буду придерживаться. План описывался мной с помощью карт MindMap. Если вам плохо видно, можно скачать .png версию вот тут (https://cloud.mail.ru/public/Hhja/58V3Wqx1G). Итак, начинаем…

План сегодняшней статьи

План сегодняшней статьи

ОСНОВНЫЕ ПОНЯТИЯ ТЕОРИИ ВЕРОЯТНОСТЕЙ

После небольшой вводной информации приступаю к описанию материала. Если говорить научным языком, то следующий материал будет посвящён методам. Здесь я расскажу о том, что такое пространство элементарных событий («sample space») и случайных величин («outcome»); приведу понятие эксперимента и то, как я его понимаю; вероятность («probability»), интерпретация вероятности и дискретных случайных величин. Ещё раз напоминаю, что предложенный препринт не является точной копией книги, поэтому, если у вас будет желание, можете перечитать первую главу и расширить представление о предмете статьи. Начинаем разбор полётов!

Пожалуй, одним из основополагающих понятий, благодаря которому можно понять, что речь идёт о теории вероятностей, а не о другой области исследования является выборка («sample») (1) и пространство элементарных событий («sample space») (2). Я воспринимаю (1) как некоторый список сущностей (или событий), которые может захватить глаз человека и представить его на бумаге. Есть второй вариант интерпретации определения (1) – это могут быть выдуманные значения (числа, символы), которые можно представить на бумаге. Эти данные являются исходными значениями для эксперимента (о нём будет сказано чуть позже). Выборку мы получаем из пространства элементарных событий (2). По сути своей это абстрактное понятие, определяющее множество выборок в пространстве.

Чуть выше мы затронули понятие эксперимента. Поскольку выше было определено, что выборка может быть, как выдуманной, так и нет, то соответственно, эксперимент я воспринимаю как некий процесс манипуляции либо с настоящими данными, либо с вымышленными. В качестве примера можно привести программный код на языке Python.

Вот пример проведения эксперимента с выдуманными данными:

import random

data = []
while len(data) != 5:
    data.append(random.randint(1, 10))
print(data)

Данный пример определяет любое событие в пространстве элементарных событий. В нашем случае пространство элементарных событий – это случайное число в промежутке от 1 до 10 (random.randint(1, 10)), которое добавляет эти значения в список data, пока его длина (len) не будет равняться 5.

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

birth_date ={'Bob': 10, 'Alice':16, 'Ann':15}
print(birth_date)

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

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

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

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

Вот пример теоретического определения вероятности:

Допустим кубик подбрасывается бесконечное количество раз, тогда в теории вероятность выпадения каждого числа стремится к

Формула определения вероятности теоретическим способом

Формула определения вероятности теоретическим способом

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

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

Например, нам нужно подбросить кубик 10 раз. Для этого я написал функцию, которая носит название «кубик».

def kubik(n: int) -> list:
    """
    
    :param n: Количество подбрасываний
    :return:  Список слкучайных подюрасываний кубика
    """
    data = []
    while len(data) <n:
        data.append(random.randint(1,6))
    return data

Она при помощи метода (random.randint(1,6)) определяет количество выпаданий случайной грани от 1 до 6. Результат случайного числа он описывает в переменную data. Если мы выполним 10 подбрасываний, то результатом будет являться список из этих значений. Значения в списке могут быть любыми.

В моём случае список получил значения [2, 1, 6, 2, 5, 5, 4, 4, 5, 6]

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

def count_rate(kub_data: list):
    """
    Возвращает частоту выпадания значений кубика,
    согласно полученным данным
    :param kub_data: данные эксперимента
    :return:
    """
    kub_rate = {}
    for i in kub_data:
        if i in kub_rate:
            continue
        else:
            kub_rate[i] = kub_data.count(i)
    for i in range(1, 7):
        if i not in kub_rate:
            kub_rate[i] = 0
    return kub_rate

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

Таким образом получается словарь, содержащий следующие данные: {2: 2, 1: 1, 6: 2, 5: 3, 4: 2, 3: 0}

Данные, конечно, я получил, но мне не нравится формат их вывода. Поэтому необходимо их отсортировать:

def sort_rate(counted_rate: dict):
    """
    Возвращает отсортированную частоту по ключу
    :param counted_rate: Наша неотсортированная частота
    :return:
    """
    sorted_rate = {}
    for key in sorted(counted_rate.keys()):
        sorted_rate[key] = counted_rate[key]
    return sorted_rate

Для сортировки хорошо подойдёт метод sorted. В официальной документации написано, что она возвращает отсортированный список, полученный из итерируемого объекта, который передан как аргумент. В моём случае итерируемый объект – это наш словарь, который мы сортируем по ключу (sorted(counted_rate.keys())).

Вот результат разработанной функции: {1: 1, 2: 2, 3: 0, 4: 2, 5: 3, 6: 2}

Следующий шаг, преобразование данного словаря в dataframe. DataFrame представляет собой табличную структуру представления данных для удобного их структурирования. Для преобразования служит библиотека pandas (ссылка на официальную документацию (для тех, кто не знает): https://pandas.pydata.org/docs/ ). Она очень популярна в Python сообществе, имеет очень много интересных плюшек, о плюсах можно много говорить, об этом много написано в том числе на Хабре, поэтому перечислять их не буду. Вот реализация функции:

def crate_dataframe(sorted_date: dict):
    """
    Создание и преобразование данных в Pandas dataframe
    :param sorted_date: dict
    :return: pd.Dataframe
    """
    df = pd.DataFrame(sorted_date, index=[0])
    df = df.T
    df = df.rename(columns={0: 'Частота'})
    df.insert(0, 'Количество выпаданий', range(1, 1 + len(df)))
    return df

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

Как выглядит DataFrame в PyCharm

Как выглядит DataFrame в PyCharm

Есть более интересные способы отображения информации, например, в Jupyter Notebook.

Сейчас будьте внимательны, там будут другие данные

Так выглядят данные в рабочем окружении Jupyter Notebook

Так выглядят данные в рабочем окружении Jupyter Notebook

Данная функция добавляет название столбцам, присваивает индекс к каждому значению и на выходе получается таблица.

Теперь самое время определить вероятности. Для того, чтобы это сделать, нужно ещё раз убедиться, что мы подбрасывали кубик ровно 10 раз и затем полученное значение разделить на частоту. Ниже опишу общую формулу:

А вот сам код:

def probability_solving(dataframe: pd.DataFrame):
    """
    Вычисление вероятности полученных результатов
    :param dataframe:
    :return:
    """
    sum_rate = dataframe['Частота'].sum()
    probability = []
    for i in dataframe['Частота']:
        probability.append(i / sum_rate)
    dataframe['Вероятность'] = probability
    return dataframe

Суммарное количество бросков описывается переменной   sum_rate, для вычисления вероятности служит цикл, который берёт значения из столбца Частота (dataframe[‘Частота’]) и вычисляет её вероятность, путём создания нового столбца (dataframe[‘Вероятность’]).

Если тестировать функцию в Pycharm, то результат будет такой:

Вероятность в Pycharm

Вероятность в Pycharm

Если в Jupyter Notebook, то такой:

Сейчас будьте внимательны, там будут другие данные

Вероятность в Jupyter Notebook

Вероятность в Jupyter Notebook

После того как мы получили результат, его можно описать. В качестве результата описания можно построить гистограмму, которая описывает плотность распределения случайных вероятностей исходя из нашей задачи. Для составления графиков вполне подойдёт matplotlib (https://matplotlib.org/ ). Её тоже много где используют и статьи по её использованию в различных задачах тоже можно встретить на Хабре. График можно получить путём импорта библиотеки и написания всего двух строчек

import matplotlib.pyplot as plt
a = proba['Вероятность'].plot(kind='bar', legend=True)
a.figure.savefig('Вероятность.png')

Вторая строчка описывает гистограмму дискретного случайного события (о нём будет сказано далее по тексту), третья строчка сохраняет график на ПК. В результате был получен график распределения вероятностей. Задача решена!

Выше я упомянул о дискретном случайном распределении. Сейчас самое время немного уделить этому внимание. Насколько мне известно в математике существует два вида распределения: непрерывное и прерывающееся. Вот как раз прерывающиеся является дискретным. Задача с кубиком описывает прерывающееся распределение, потому что мы не можем получить значение 1,1 или 1,2 (если конечно не обозначим их на гранях). Зачастую они описываются с помощью гистограмм. Непрерывное распределение описывает линейный график, у которого могут быть выпуклости, вогнутости, экстремумы и т.д.

Ниже описана гистограмма распределения вероятности

Гистограмма распределения вероятности случайных величин при подбрасывании кубика

Гистограмма распределения вероятности случайных величин при подбрасывании кубика

Заключение и выводы

На данный момент — это всё, о чём я хотел рассказать в текущей теме, посвящённой вероятностям. Я знаю, что эту тему можно освящать и расширять бесконечно, поэтому ждите следующие статьи.  Признаюсь, когда я всё это описывал мне было самому интересно рефлексировать по данной теме. Считаю третий этап по публикации на Хабре почти выполнен, осталось дождаться рецензирования статьи модераторами. Очень надеюсь, что её одобрят. Всего доброго и до новых встреч.

Python

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

Skillfactory.ru

Быстрый поиск в Google выявляет 4 основные математические темы, на которых основана вся область:

  • Линейная алгебра
  • Анализ
  • Статистика
  • Вероятность

Сегодня я расскажу о двух важнейших концепциях из теории вероятности: сочетаниях и перестановках

Начнем с базового определения самой вероятности: 

Вероятность — степень (относительная мера, количественная оценка) возможности наступления некоторого события. В теории вероятностей вероятность принимает значения от 0 до 1. Значение 1 соответствует достоверному событию, невозможное событие имеет вероятность 0. Чем выше значение, тем больше вероятность события.

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

Перед погружением в перестановки и сочетания, нужно понять еще один термин — факториал

Что такое факториал? 

Хороший вопрос. Согласно Википедии: 

Факториал — функция, определённая на множестве неотрицательных целых чисел. Факториал натурального числа n определяется как произведение всех натуральных чисел от 1 до n включительно.

Факториал вычисляется по следующей формуле: 

Вот пример:

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

Вот простая рекурсивная функция, которая справится с задачей: 

Теперь можно использовать эту функцию для проверки примера выше: 

Хорошо, но где факториалы используются в реальном мире? 

Скажем, в гонке участвуют пять человек, и вы хотите узнать количество способов, по которым эти пятеро могут финишировать первыми, вторыми или третьими. Можно взять листок бумаги и просто записать все возможные варианты, но зачем? Что если участников 100? 

Вот как эта задача решается с помощью факториалов: 

Это называется перестановка

Перестановки

И снова начнем с определения: 

В математике перестановка — это упорядочение членов набора в последовательность или, если последовательность уже определена, перестановка (изменение порядка) ее элементов. 

Существует два способа вычисления перестановок. Выбор способа зависит от того, разрешается повторение или нет. Давайте рассмотрим на примере.

У вас есть веб-сайт, на котором могут регистрироваться пользователи. Им нужно вводить пароль длиной строго в 8 символов, которые не должны повторяться. Сперва нужно определить, сколько букв и цифр в английском алфавите:

  • количество букв: 26
  • количество цифр: 10

То есть всего 36. Тогда n = 36, а r = 8, потому что пароль должен быть длиной в 8 символов. Зная это, мы легко можем рассчитать количество уникальных паролей, используя формулу: 

Если вы поспешили и посчитали вручную: 

В Python это тривиальная задача:

Здорово, но я хочу разрешить пользователям повторно использовать символы. Нет проблем, в данном случае это перестановки с повторениями, формула еще проще: 

Skillfactory.ru

Мы уже знаем, что n (36) и r (8), так что вот решение:

И снова реализация на Python тривиальна:

Это действительно большое число. Попробуйте произнести его вслух! 

Сочетания

Далее на повестке дня — сочетания. Вам наверняка любопытно, что это такое и в чем их отличие от перестановок. Начнем с определения: 

Сочетание— это выбор значений из набора, в котором (в отличие от перестановок) порядок выбора не имеет значения. 

Чтобы понять это определение, разберем следующий пример: группа людей, выбранных в команду — это та же самая группа, независимо от порядка участников. Вот и вся идея сочетаний. Если выбрать 5 членов команды, можно упорядочить их по имени, росту или другому параметру, но команда останется прежней — порядок не имеет значения. 

Давайте запишем это формулой. Количество сочетаний C набора из n объектов, взятых по r, рассчитывается так:

С этим уравнением мы можем решить следующую задачу: сколькими способами можно выбрать в футбольную команду 5 человек из 10? 

Группа будет той же, порядок значения не имеет. Значит, n = 10, а r = 5:

И это можно легко сделано в Python:

Великолепно! Но интересно, существует ли версия сочетаний с повторениями? Да! 

Представьте, что готовите сэндвич и по какой-то причине вам нужно использовать только 4 ингредиента из 10. Однако ингредиенты не должны быть уникальны, например, можно положить 3 куска сыра и 1 кусок салями. Как это здорово, я тоже обожаю сыр, вот спасибо!

Но как сформулировать эту идею математически? Ответ снова прост:

Давайте применим формулу к примеру выше. n снова равно 10 (потому что 10 возможных ингредиентов), а r = 4 (потому что выбрать можно только 4):

Используем Python для проверки:

 Превосходно. 

И напоследок 

Сочетания и перестановки математически просты, однако сложность заключается в том, как представить в такой форме реальные проблемы. Иногда бывает трудно выделить значения n и r в повседневной жизни. Я не могу решить для вас подобные задачи, но надеюсь, что данная статья поможет вам разобраться. 

Читайте также:

  • Как организовать код в Python
  • Превращаем сценарии Python в инструменты МО
  • Создаем чат-бот в Python с помощью nltk

Перевод статьи Dario Radečić: Essential Probability in Python: Permutations and Combinations

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    A probability Distribution represents the predicted outcomes of various values for a given data. Probability distributions occur in a variety of forms and sizes, each with its own set of characteristics such as mean, median, mode, skewness, standard deviation, kurtosis, etc. Probability distributions are of various types let’s demonstrate how to find them in this article.

    Normal Distribution

    The normal distribution is a symmetric probability distribution centered on the mean, indicating that data around the mean occur more frequently than data far from it. the normal distribution is also called Gaussian distribution. The normal distribution curve resembles a bell curve. In the below example we create normally distributed data using the function stats.norm() which generates continuous random data. the parameter scale refers to standard deviation and loc refers to mean. plt.distplot() is used to visualize the data. KDE refers to kernel density estimate, other parameters are for the customization of the plot. A bell-shaped curve can be seen as we visualize the plot.

    Python3

    import scipy.stats as stats

    import seaborn as sns

    import matplotlib.pyplot as plt

    data =stats.norm(scale=1, loc=0).rvs(1000)

    ax = sns.distplot(data,

                      bins=50,

                      kde=True,

                      color='red',

                      hist_kws={"linewidth": 15,'alpha':1})

    ax.set(xlabel='Normal Distribution', ylabel='Frequency')

    plt.show()

    Output:

    Binomial Distribution

    Under a given set of factors or assumptions, the binomial distribution expresses the likelihood that a variable will take one of two outcomes or independent values. ex: if an experiment is successful or a failure. if the answer for a question is “yes” or “no” etc… . np.random.binomial() is used to generate binomial data. n refers to a number of trails and prefers the probability of each trail. 

    Python3

    import seaborn as sns

    import matplotlib.pyplot as plt

    import numpy as np

    n, p = 10, .6

    data = np.random.binomial(n, p, 10000)

    ax = sns.distplot(data,

                      bins=20,

                      kde=False,

                      color='red',

                      hist_kws={"linewidth": 15, 'alpha': 1})

    ax.set(xlabel='Binomial Distribution', ylabel='Frequency')

    plt.show()

    Output:

    Poisson Distribution:

    A Poisson distribution is a kind of probability distribution used in statistics to illustrate how many times an event is expected to happen over a certain amount of time. It’s also called count distribution. np.random.poisson function() is used to create data for poisson distribution. lam refers to The number of occurrences that are expected to occur in a given time frame. In this example, we can take the condition as “if a student studies for 5 hours a day, the probability that he’ll study 6 hours a day is?.

    Python3

    import seaborn as sns

    import matplotlib.pyplot as plt

    import numpy as np

    poisson_data = np.random.poisson(lam=5, size=1000)

    ax = sns.distplot(poisson_data,

                      kde=False,

                      color='blue')

    ax.set(xlabel='Poisson Distribution', ylabel='Frequency')

    plt.show()

    Output: 

    Last Updated :
    30 May, 2022

    Like Article

    Save Article

    • Редакция Кодкампа

    17 авг. 2022 г.
    читать 1 мин


    Условная вероятность того, что событие А произойдет при условии, что произошло событие В , рассчитывается следующим образом:

    Р(А|В) = Р(А∩В) / Р(В)

    куда:

    P(A∩B) = вероятность того, что событие A и событие B произойдут.

    P(B) = вероятность того, что событие B произойдет.

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

    Пример: вычисление условной вероятности в Python

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

    Мы можем создать следующую таблицу в Python для хранения ответов на опрос:

    import pandas as pd
    import numpy as np
    
    #create pandas DataFrame with raw data
    df = pd.DataFrame({'gender ': np.repeat (np.array(['Male', 'Female']), 150),
     'sport ': np.repeat (np.array(['Baseball', 'Basketball', 'Football',
     'Soccer', 'Baseball', 'Basketball',
     'Football', 'Soccer']), 
     (34, 40, 58, 18, 34, 52, 20, 44))})
    
    #produce contingency table to summarize raw data
    survey_data = pd.crosstab (index=df['gender'], columns=df['sport'], margins= True )
    
    #view contingency table
    survey_data
    
    sport Baseball Basketball Football Soccer All
    gender 
    Female 34 52 20 44 150
    Male 34 40 58 18 150
    All 68 92 78 62 300
    

    Связанный : Как использовать pd.crosstab() для создания таблиц непредвиденных обстоятельств в Python

    Мы можем использовать следующий синтаксис для извлечения значений из таблицы:

    #extract value in second row and first column 
    survey_data. iloc [1, 0]
    
    [1] 34
    

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

    #calculate probability of being male, given that individual prefers baseball
    survey_data. iloc [1, 0] / survey_data. iloc [2, 0]
    
    0.5
    

    И мы можем использовать следующий синтаксис, чтобы вычислить вероятность того, что человек предпочитает баскетбол в качестве своего любимого вида спорта, учитывая, что он женщина:

    #calculate probability of preferring basketball, given that individual is female
    survey_data. iloc [0, 1] / survey_data. iloc [0, 4]
    
    0.3466666666666667
    

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

    Дополнительные ресурсы

    Следующие руководства содержат дополнительную информацию о работе с вероятностью:

    Закон полной вероятности
    Как найти среднее значение распределения вероятностей
    Как найти стандартное отклонение распределения вероятностей

    Перевод статьи «Using For Loops in Python: Calculating Probabilities».

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


    Циклы — одно из фундаментальных понятий в программировании на Python. Особенно важны эти знания при работе с большим массивом данных. 

    У многих занимающихся статистикой и дата сайенс, возникает мысль: «А зачем нам все это? Ведь привести наш код в порядок могут программисты!».

    Но порой человек, пишущий код, должен знать и статистику, и способы обработки выходных данных. Эти процессы неразделимы! 

    Вот один из примеров, когда умелое применение for облегчает и улучшает статистический анализ. 

    Кумулятивные биномиальные вероятности — краткий экскурс 

    Для вычисления вероятности нам необходимы две переменные: N (число наблюдений) и λ (лямбда — количество попаданий в цель/количество благоприятных исходов в серии экспериментов). Кумулятивная биномиальная вероятность означает следующее: с увеличением количества испытаний возрастает шанс возникновения какого-либо события. 

    probability = 1-((1-λ)^N)

    Пример. Возьмем «честный» шестигранный кубик и вычислим вероятность выпадения 6. Она равна 1/6. Но мы проведем этот эксперимент 10 раз подряд: 

    1-((1-0.1667)^10) = 0.8385

    Как видите, шанс выпадения 6 увеличивается до 83.85%

    Закон больших чисел гласит: увеличиваем количество испытаний — увеличивается шанс возникновения какого-либо события. Это утверждение справедливо даже в том случае, если вероятность события в рамках одного испытания очень низкая. А теперь мы разберем, как увеличивается вероятность события с увеличением количества испытаний.

    Модель без циклов

    Ниже — скрипт, вычисляющий кумулятивную биномиальную вероятность без циклов:

    import numpy as np
    import pandas as pd
    
    l = 0.02
    m = 0.04
    n = 0.06
    
    p=np.arange(0, 100, 1)
    
    h = 1 - l
    j = 1 - m
    k = 1 - n
    
    q = 1-(h**p)
    r = 1-(j**p)
    s = 1-(k**p)
    • l, m и n — вероятности определенных событий. 
    • p — количество испытаний (до 100)
    • q, r и s — кумулятивные биномиальные вероятности. Их значение будет расти вместе с количеством испытаний. 

    Вывод:

    >>> q
    array([0., 0.02, 0.0396, 0.058808, 0.07763184, 0.0960792, 0.11415762, 0.13187447, 0.14923698, 0.16625224, ..., 0.8532841, 0.85621842, 0.85909405, 0.86191217, 0.86467392])
    >>> r
    array([0., 0.04, 0.0784, 0.115264, 0.15065344, 0.1846273, 0.21724221, 0.24855252, 0.27861042, 0.307466, ..., 0.97930968, 0.9801373, 0.9809318, 0.98169453, 0.98242675])
    >>> s
    array([0., 0.06, 0.1164, 0.169416, 0.21925104, 0.26609598, 0.31013022, 0.35152241, 0.39043106, 0.4270052, 0.46138489, 0.49370179, 0.52407969, 0.5526349, 0.57947681, ..., 0.99720008, 0.99736807, 0.99752599, 0.99767443, 0.99781396])

    Как видим, вероятности q, r и s растут прямо пропорционально количеству испытаний. 

    Но у модели без использования циклов есть существенный недостаток — вероятности событий указываются конечным пользователем. А что, если мы захотим перебрать вероятности от 0.01 до 0.99?

    Модель с циклами: генераторы списков и двумерные массивы

    В этот раз мы рассмотрим другую модель: у нас будет лишь одно событие и его вероятность. Значения будут перебираться от 0.01 до 0.99. Количество испытаний все то же — 100.

    import numpy as np
    import pandas as pd
    
    # генератор списка
    probability = [x*0.01 for x in range(1,100)]
    probability = np.array(probability)
    
    h = 1 - probability
    
    # создаем двумерный массив
    result = 1-h[:, np.newaxis] ** np.arange(1,100)
    print(result)

    Вывод:

    >>> probability
    array([0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, ... 0.96, 0.97, 0.98, 0.99])

    Обратите внимание, что использование генератора списков обязательно. Причина проста — функция range() работает только с int, а не с float

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

    >>> for i in range(1,100,1):
    >>>     print(1-(h**i))
    [0.01 0.02] 
    [0.0199 0.0396]
    ...
    [0.62653572 0.86191217]
    [0.63027036 0.86467392]

    Вместо этого мы бы хотели видеть отсортированный массив: [0.01, 0.0199, …, 0.62653572, 0.63027036] и [0.02, 0.0396, …, 0.86191217, 0.86467392]

    Что интересно — транспонирование не даст нужного результата, так как h — одномерный массив.

    Можно поступить так: вычислить двумерный массив и вывести его в консоль напрямую:

    >>> result = 1-h[:, np.newaxis] ** np.arange(1,100)
    >>> result
    array([[0.01, 0.0199, 0.029701, ..., 0.62653572, 0.63027036], 
    [0.02, 0.0396, 0.058808, ..., 0.86191217, 0.86467392], 
    [0.03, 0.0591, 0.087327, ..., 0.94946061, 0.9509768], ..., 
    [0.97, 0.9991, 0.999973, ..., 1., 1., 1.], 
    [0.98, 0.9996, 0.999992, ..., 1., 1., 1.], 
    [0.99, 0.9999, 0.999999, ..., 1., 1.,1.]])

    Как видите, мы только что вычислили кумулятивную биномиальную вероятность для интервала от 0.01 до 0.99.

    Также использование цикла for облегчило нам задачу, ведь мы автоматически вычислили нужные нам вероятности — от 0.01 до 0.99! Делать все это вручную — задача сложная и неблагодарная. 

    Вывод

    Итак, мы научились:

    • вычислять кумулятивную биномиальную вероятность.
    • использовать циклы for для перебора огромного диапазона значений. 
    • работать с float при помощи генератора списков.
    • работать с двумерными массивами, если транспонирование одномерного не имеет смысла.

    Понравилась статья? Поделить с друзьями:

    Не пропустите также:

  • Как найти пароль в браузере google
  • Как составит свой маршрут по индии
  • Как составить официальное письмо застройщику
  • Как найти проекцию матрицы
  • Ссылки как найти маму

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии