Bayesisches Updating mit Matplotlib

PythonPythonBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Das Bayes'sche Updating ist ein statistisches Verfahren, das uns ermöglicht, die Wahrscheinlichkeit einer Hypothese bei Verfügbarkeit neuer Daten zu aktualisieren. In diesem Lab verwenden wir Matplotlib, um eine Animation zu erstellen, die zeigt, wie das Bayes'sche Updating funktioniert. Genauer gesagt simulieren wir ein Münzwurfexperiment und verwenden das Bayes'sche Updating, um die Wahrscheinlichkeit zu schätzen, dass die Münze auf Kopf fällt.

Tipps für die virtuelle Maschine

Nachdem der Start der virtuellen Maschine abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Importieren der erforderlichen Bibliotheken

Wir beginnen mit dem Importieren der Bibliotheken, die wir im Lab verwenden werden. Genauer gesagt werden wir matplotlib.pyplot für die Visualisierung, numpy für numerische Berechnungen und math für mathematische Funktionen verwenden.

import math

import matplotlib.pyplot as plt
import numpy as np

Definieren der Beta-Verteilungs-PDF

Die Beta-Verteilung ist eine kontinuierliche Wahrscheinlichkeitsverteilung, die häufig verwendet wird, um die Verteilung von Wahrscheinlichkeiten darzustellen. Beim Bayes'schen Updating verwenden wir die Beta-Verteilung als Vorverteilung, um unsere Überzeugungen über die Wahrscheinlichkeit einer Hypothese darzustellen, bevor wir irgendwelche Daten beobachten. Anschließend aktualisieren wir die Beta-Verteilung, wenn wir neue Daten beobachten.

Um das Bayes'sche Updating zu simulieren, müssen wir eine Funktion definieren, die die Wahrscheinlichkeitsdichtefunktion (PDF) der Beta-Verteilung berechnet. Wir können die math.gamma-Funktion verwenden, um die Gamma-Funktion zu berechnen, die in der Beta-Verteilungs-PDF verwendet wird.

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

Definieren der UpdateDist-Klasse

Als nächstes definieren wir eine Klasse namens UpdateDist, die verwendet werden soll, um die Beta-Verteilung bei Beobachtung neuer Daten zu aktualisieren. Die UpdateDist-Klasse nimmt zwei Argumente entgegen: das Matplotlib-Achsenobjekt und die anfängliche Erfolgswahrscheinlichkeit.

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')

Die __init__-Methode initialisiert die Klasseninstanz, indem sie die anfängliche Anzahl der Erfolge auf Null setzt (self.success = 0) und die anfängliche Erfolgswahrscheinlichkeit auf den als Argument übergebenen Wert (self.prob = prob). Wir erstellen auch ein Linienobjekt, um die Beta-Verteilung darzustellen, und legen die Diagrammeinstellungen fest.

Die __call__-Methode wird jedes Mal aufgerufen, wenn die Animation aktualisiert wird. Sie simuliert ein Münzwurfexperiment und aktualisiert die Beta-Verteilung entsprechend.

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,

Wenn dies der erste Frame der Animation ist (if i == 0), setzen wir die Anzahl der Erfolge auf Null zurück und löschen das Linienobjekt. Andernfalls simulieren wir ein Münzwurfexperiment, indem wir eine Zufallszahl zwischen 0 und 1 generieren (np.random.rand()) und sie mit der Erfolgswahrscheinlichkeit (self.prob) vergleichen. Wenn die Zufallszahl kleiner als die Erfolgswahrscheinlichkeit ist, zählen wir es als Erfolg und aktualisieren die Beta-Verteilung mit der beta_pdf-Funktion. Schließlich aktualisieren wir das Linienobjekt mit den neuen Daten und geben es zurück.

Erstellen der Animation

Jetzt, nachdem wir die UpdateDist-Klasse definiert haben, können wir die Animation mit der FuncAnimation-Klasse von Matplotlib erstellen. Wir erstellen ein Figurenobjekt und ein Achsenobjekt und übergeben das Achsenobjekt an die UpdateDist-Klasse, um eine neue Instanz der Klasse zu erstellen.

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

Die FuncAnimation-Klasse nimmt mehrere Argumente entgegen:

  • fig: das Figurenobjekt
  • ud: die UpdateDist-Instanz
  • frames: die Anzahl der zu animierenden Frames
  • interval: die Zeit zwischen den Frames in Millisekunden
  • blit: ob nur die Teile des Plots aktualisiert werden, die sich geändert haben

Ergebnisse interpretieren

Die Animation zeigt, wie die Beta-Verteilung aktualisiert wird, wenn neue Daten beobachtet werden. Die schwarze gestrichelte Linie repräsentiert die wahre Erfolgswahrscheinlichkeit (d.h. die Wahrscheinlichkeit, dass die Münze auf Kopf fällt). Während der Animation sehen wir, dass die Beta-Verteilung mit einem Maximum bei der Vorwahrscheinlichkeit der Erfolgswahrscheinlichkeit (0,7) beginnt und sich allmählich in Richtung der wahren Erfolgswahrscheinlichkeit verschiebt, wenn mehr Daten beobachtet werden.

Zusammenfassung

In diesem Lab haben wir Matplotlib verwendet, um eine Animation zu erstellen, die das Bayes'sche Updating demonstriert. Wir haben eine Funktion definiert, um die Beta-Verteilungs-PDF zu berechnen, und eine Klasse, um die Beta-Verteilung bei Beobachtung neuer Daten zu aktualisieren. Anschließend haben wir die FuncAnimation-Klasse von Matplotlib verwendet, um die Animation zu erstellen und die Ergebnisse zu interpretieren.