Actualización bayesiana con Matplotlib

PythonPythonBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

La actualización bayesiana es un enfoque estadístico que nos permite actualizar la probabilidad de una hipótesis a medida que se disponen de nuevos datos. En este laboratorio, usaremos Matplotlib para crear una animación que muestre cómo funciona la actualización bayesiana. Específicamente, simularemos un experimento de lanzamiento de moneda y usaremos la actualización bayesiana para estimar la probabilidad de que la moneda caiga con la cara hacia arriba.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar las bibliotecas necesarias

Comenzamos importando las bibliotecas que usaremos en el laboratorio. Específicamente, usaremos matplotlib.pyplot para la visualización, numpy para el cálculo numérico y math para las funciones matemáticas.

import math

import matplotlib.pyplot as plt
import numpy as np

Definir la función de densidad de probabilidad (PDF) de la distribución beta

La distribución beta es una distribución de probabilidad continua que a menudo se utiliza para representar la distribución de probabilidades. En la actualización bayesiana, usamos la distribución beta como una distribución a priori para representar nuestras creencias sobre la probabilidad de una hipótesis antes de observar cualquier dato. Luego actualizamos la distribución beta a medida que observamos nuevos datos.

Para simular la actualización bayesiana, necesitamos definir una función que calcule la función de densidad de probabilidad (PDF) de la distribución beta. Podemos usar la función math.gamma para calcular la función gamma, que se utiliza en la PDF de la distribución beta.

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

Definir la clase UpdateDist

A continuación, definimos una clase llamada UpdateDist que se utilizará para actualizar la distribución beta a medida que se observan nuevos datos. La clase UpdateDist toma dos argumentos: el objeto de eje de Matplotlib y la probabilidad inicial de éxito.

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

        ## Establecer los parámetros del gráfico
        self.ax.set_xlim(0, 1)
        self.ax.set_ylim(0, 10)
        self.ax.grid(True)

        ## Esta línea vertical representa el valor teórico, al
        ## cual debe converger la distribución trazada.
        self.ax.axvline(prob, linestyle='--', color='black')

El método __init__ inicializa la instancia de la clase estableciendo el número inicial de éxitos en cero (self.success = 0) y la probabilidad inicial de éxito al valor pasado como argumento (self.prob = prob). También creamos un objeto de línea para representar la distribución beta y configuramos los parámetros del gráfico.

El método __call__ se llama cada vez que se actualiza la animación. Simula un experimento de lanzamiento de moneda y actualiza la distribución beta en consecuencia.

def __call__(self, i):
        ## De esta manera, el gráfico puede ejecutarse continuamente y solo
        ## seguimos viendo nuevas realizaciones del proceso
        if i == 0:
            self.success = 0
            self.line.set_data([], [])
            return self.line,

        ## Elegir éxito si se supera un umbral con una selección uniforme
        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,

Si este es el primer fotograma de la animación (if i == 0), reiniciamos el número de éxitos a cero y eliminamos el objeto de línea. De lo contrario, simulamos un experimento de lanzamiento de moneda generando un número aleatorio entre 0 y 1 (np.random.rand()) y comparándolo con la probabilidad de éxito (self.prob). Si el número aleatorio es menor que la probabilidad de éxito, lo contamos como un éxito y actualizamos la distribución beta utilizando la función beta_pdf. Finalmente, actualizamos el objeto de línea con los nuevos datos y lo devolvemos.

Crear la animación

Ahora que hemos definido la clase UpdateDist, podemos crear la animación utilizando la clase FuncAnimation de Matplotlib. Creamos un objeto de figura y un objeto de eje y pasamos el objeto de eje a la clase UpdateDist para crear una nueva instancia de la clase.

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

La clase FuncAnimation toma varios argumentos:

  • fig: el objeto de figura
  • ud: la instancia de UpdateDist
  • frames: el número de fotogramas para animar
  • interval: el tiempo entre fotogramas en milisegundos
  • blit: si se debe actualizar solo las partes del gráfico que han cambiado

Interpretar los resultados

La animación muestra cómo se actualiza la distribución beta a medida que se observan nuevos datos. La línea discontinua negra representa la verdadera probabilidad de éxito (es decir, la probabilidad de que la moneda caiga con la cara hacia arriba). A medida que avanza la animación, vemos que la distribución beta comienza con un pico en la probabilidad a priori de éxito (0,7) y se desplaza gradualmente hacia la verdadera probabilidad de éxito a medida que se observan más datos.

Resumen

En este laboratorio, usamos Matplotlib para crear una animación que demuestra la actualización bayesiana. Definimos una función para calcular la PDF de la distribución beta y una clase para actualizar la distribución beta a medida que se observan nuevos datos. Luego usamos la clase FuncAnimation de Matplotlib para crear la animación e interpretar los resultados.