Введение
Байесовский обновление - это статистический подход, который позволяет обновлять вероятность гипотезы при появлении новых данных. В этом лабораторном занятии мы будем использовать 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: экземпляр классаUpdateDistframes: количество кадров для анимацииinterval: время между кадрами в миллисекундахblit: определяет, обновлять только те части графика, которые изменились
Интерпретируем результаты
Анимация показывает, как бета-распределение обновляется при наблюдении новых данных. Черная пунктирная линия представляет собой истинную вероятность успеха (т.е., вероятность того, что монета упадет орлом вверх). При проигрывании анимации мы видим, что бета-распределение начинается с пика при априорной вероятности успеха (0,7) и постепенно сдвигается к истинной вероятности успеха при наблюдении большего количества данных.
Резюме
В этом практическом занятии мы использовали Matplotlib для создания анимации, демонстрирующей байесовское обновление. Мы определили функцию для вычисления PDF бета-распределения и класс для обновления бета-распределения при наблюдении новых данных. Затем мы использовали класс FuncAnimation из Matplotlib для создания анимации и интерпретации результатов.