Байесовское обновление с использованием Matplotlib

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Советы по работе с ВМ

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

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

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем необходимые библиотеки

Начнем с импорта библиотек, которые будем использовать в лабораторном занятии. Конкретно, мы будем использовать matplotlib.pyplot для визуализации, numpy для численного вычисления и math для математических функций.

import math

import matplotlib.pyplot as plt
import numpy as np

Определяем функцию плотности вероятности для бета-распределения

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

Для моделирования байесовского обновления нам нужно определить функцию, которая вычисляет функцию плотности вероятности (PDF) для бета-распределения. Мы можем использовать функцию math.gamma для вычисления гамма-функции, которая используется в PDF бета-распределения.

def beta_pdf(x, a, b):
    return (x**(a-1) * (1-x)**(b-1) * math.gamma(a + b)
            / (math.gamma(a) * math.gamma(b)))

Определяем класс UpdateDist

Далее мы определяем класс под названием UpdateDist, который будет использоваться для обновления бета-распределения при наблюдении новых данных. Класс UpdateDist принимает два аргумента: объект оси Matplotlib и начальную вероятность успеха.

class UpdateDist:
    def __init__(self, ax, prob=0.5):
        self.success = 0
        self.prob = prob
        self.line, = ax.plot([], [], 'k-')
        self.x = np.linspace(0, 1, 200)
        self.ax = ax

        ## Set up plot parameters
        self.ax.set_xlim(0, 1)
        self.ax.set_ylim(0, 10)
        self.ax.grid(True)

        ## This vertical line represents the theoretical value, to
        ## which the plotted distribution should converge.
        self.ax.axvline(prob, linestyle='--', color='black')

Метод __init__ инициализирует экземпляр класса, устанавливая начальное количество успехов равным нулю (self.success = 0) и начальную вероятность успеха значением, переданным в качестве аргумента (self.prob = prob). Мы также создаем объект линии для представления бета-распределения и настраиваем параметры графика.

Метод __call__ вызывается каждый раз при обновлении анимации. Он моделирует эксперимент с подбрасыванием монеты и обновляет бета-распределение соответственно.

def __call__(self, i):
        ## This way the plot can continuously run and we just keep
        ## watching new realizations of the process
        if i == 0:
            self.success = 0
            self.line.set_data([], [])
            return self.line,

        ## Choose success based on exceed a threshold with a uniform pick
        if np.random.rand() < self.prob:
            self.success += 1
        y = beta_pdf(self.x, self.success + 1, (i - self.success) + 1)
        self.line.set_data(self.x, y)
        return self.line,

Если это первый кадр анимации (if i == 0), мы сбрасываем количество успехов до нуля и очищаем объект линии. В противном случае мы моделируем эксперимент с подбрасыванием монеты, генерируя случайное число от 0 до 1 (np.random.rand()) и сравнивая его с вероятностью успеха (self.prob). Если случайное число меньше вероятности успеха, мы считаем это успехом и обновляем бета-распределение с использованием функции beta_pdf. Наконец, мы обновляем объект линии новыми данными и возвращаем его.

Создаем анимацию

Теперь, когда мы определили класс UpdateDist, мы можем создать анимацию с использованием класса FuncAnimation из Matplotlib. Мы создаем объект фигуры и объект оси и передаем объект оси в класс UpdateDist, чтобы создать новый экземпляр класса.

fig, ax = plt.subplots()
ud = UpdateDist(ax, prob=0.7)
anim = FuncAnimation(fig, ud, frames=100, interval=100, blit=True)
plt.show()

Класс FuncAnimation принимает несколько аргументов:

  • fig: объект фигуры
  • ud: экземпляр класса UpdateDist
  • frames: количество кадров для анимации
  • interval: время между кадрами в миллисекундах
  • blit: определяет, обновлять только те части графика, которые изменились

Интерпретируем результаты

Анимация показывает, как бета-распределение обновляется при наблюдении новых данных. Черная пунктирная линия представляет собой истинную вероятность успеха (т.е., вероятность того, что монета упадет орлом вверх). При проигрывании анимации мы видим, что бета-распределение начинается с пика при априорной вероятности успеха (0,7) и постепенно сдвигается к истинной вероятности успеха при наблюдении большего количества данных.

Резюме

В этом практическом занятии мы использовали Matplotlib для создания анимации, демонстрирующей байесовское обновление. Мы определили функцию для вычисления PDF бета-распределения и класс для обновления бета-распределения при наблюдении новых данных. Затем мы использовали класс FuncAnimation из Matplotlib для создания анимации и интерпретации результатов.