[PYTHON] Bayes Update

Einführung

Ich habe darüber gesprochen, Bayes in der Atmosphäre zu aktualisieren, also wollte ich richtig lernen und es zusammenfassen. Dies ist der n-te Abkochartikel.

Referenz

Verfahren

Bayes Update

Die Bayes'sche Schätzung wird grob zusammengefasst, und die Verteilung der Parameter wird unter Verwendung des Bayes'schen Theorems geschätzt, anstatt die Parameter der Wahrscheinlichkeit (= Modell) mit MLE punktuell zu schätzen. Der Satz von Bayes wird durch die folgende Gleichung ausgedrückt.

p(w|x) = \frac{p(x|w)p(w)}{p(x)}

p(x|w)Ist die Wahrscheinlichkeit (= Modell),p(w)Ist vorherige Verteilung,p(x)Ist die Wahrscheinlichkeit des Auftretens von Daten.p(w|x)Wird posteriore Verteilung genannt. Diese Formel ist eine Formel, mit der die Verteilung (hintere Verteilung) des Parameters $ w $ bei Angabe der Daten $ x $ erhalten werden kann, indem die vorherige Verteilung des Parameters $ w $ des Modells mit der Wahrscheinlichkeit multipliziert wird. ..

Das Bayes'sche Update ist ein Mechanismus, der den Bayes'schen Satz verwendet, um die posteriore Verteilung sequentiell zu aktualisieren. Die folgende Entwicklung basiert auf hier. Zunächst transformieren wir den Bayes'schen Satz.

\begin{align}
&p(A, B, C) = p(A|B, C)p(B, C) = p(B, C|A)p(A) \\
\Rightarrow& p(A|B, C) = \frac{p(B, C|A)p(A)}{p(B, C)}
\end{align}

Bis zu diesem Punkt gilt es in der Regel.

Als nächstes nehmen wir an, dass B und C bei A unabhängig und bedingt unabhängig sind. Dann erhalten wir die folgende Gleichung:

\begin{align}
p(A|B, C) &= \frac{p(B, C|A)p(A)}{p(B, C)} \\
&= \frac{p(B|A)p(C|A)p(A)}{p(B)p(C)} \\
&= \frac{p(C|A)}{p(C)}\frac{p(B|A)p(A)}{p(B)} \\
&= \frac{p(C|A)}{p(C)}p(A|B)
\end{align}

Setzen wir nun $ w $ in A, die ersten beobachteten Daten $ x_1 $ in B und die zweiten beobachteten Daten $ x_2 $ in C. "$ X_1 $ und $ x_2 $ sind unabhängig und bedingte Unabhängigkeit bei $ w $" bedeutet, dass die beobachteten Daten unabhängig von der Verteilung generiert werden und die Wahrscheinlichkeit (= Modell) ebenfalls $ x_1 beträgt. Dies bedeutet, dass $ und $ x_2 $ unabhängig voneinander modelliert werden. Beachten Sie, dass diese Eigenschaft nicht für Daten gilt, die zeitreihenkorreliert sind. Zu diesem Zeitpunkt gilt die folgende Gleichung.

\begin{align}
p(w|x_1, x_2) = \frac{p(x_2|w)}{p(x_2)}p(w|x_1)
\end{align}

Die hintere Verteilung von $ w $ unter Berücksichtigung der Daten $ x_1 $ und $ x_2 $ ist der Bayes'sche Satz von $ x_2 $ und $ w $ mit $ p (w | x_1) $ als vorheriger Verteilung. Ich werde! Geben Sie unter Verwendung dieser Beziehung eine geeignete vorherige Verteilung an → Finden Sie die hintere Verteilung, wenn Daten angegeben werden → Ersetzen Sie die hintere Verteilung durch die vorherige Verteilung → Finden Sie die hintere Verteilung, wenn Daten angegeben werden → ... und so weiter. Sie können die Distribution aktualisieren. So funktioniert das Bayes-Update.

Beispiel für ein Bayes-Update

Berechnen wir das Bayes'sche Update unter hier.

Betrachten Sie eine verzerrte Münze. Schätzen wir die Wahrscheinlichkeit, dass diese Münze auf dem Tisch erscheint. Angenommen, die Münzrolle wird bei jedem Versuch unabhängig erhalten. Betrachten Sie zunächst die Wahrscheinlichkeit oder das Modell des Münzwurfs. Da Vorder- und Rückseite der Münze binäre Variablen sind, folgen sie der Bernoulli-Verteilung. Daher ist die Wahrscheinlichkeit eine Bernoulli-Verteilung. Entsprechen Sie der Vorderseite $ x = 1 $ und der Rückseite $ x = 0 $. $ w $ ist eine reelle Zahl zwischen 0 und 1 und entspricht der Wahrscheinlichkeit, dass die Tabelle angezeigt wird. Daher ist die Verteilung von $ w $, die durch das Bayes'sche Update selbst erhalten wird, die Verteilung der Wahrscheinlichkeit, dass die Tabelle erscheint.

Die Bernoulli-Distribution kann wie folgt geschrieben werden:

\begin{align}
p(x|w) = w^x(1-w)^{1-x}
\end{align}

Nehmen wir an, dass die vorherige Verteilung als informationslose vorherige Verteilung $ p (w) = 1 $ ist. $ p (x) $ ist unbekannt, aber wenn Sie sich auf $ w $ konzentrieren, handelt es sich um eine standardisierte Konstante, sodass sie automatisch unter der Bedingung berechnet werden kann, dass die Integration von $ p (w | x) $ 1 ist.

Jetzt schütteln wir die Münze.

1. Mal: Tabelle

\begin{align}
p(w|x_1=1) \propto p(x_1=1|w)p(w) = w
\end{align}

Es wurde bereits standardisiert, da es bei der Integration von 0 auf 1 zu 1 wird.

\begin{align}
p(w|x_1=1) = w
\end{align}

Dies ist die zweite vorherige Verteilung $ p (w) = p (w | x_1 = 1) = w $.

Zweites Mal: Tabelle

\begin{align}
p(w|x_1=1, x_2=1) \propto p(x_2=1|w)p(w) = w^2
\end{align}

Wenn es integriert ist, wird es 1/3, und wenn es standardisiert ist, wird es wie folgt.

\begin{align}
p(w|x_1=1, x_2=1) = 3w^2
\end{align}

Dies ergibt die dritte vorherige Verteilung $ p (w) = p (w | x_1 = 1, x_2 = 1) = 3w ^ 2 $.

Drittes Mal: zurück

\begin{align}
p(w|x_1=1, x_2=1, x_3=0) \propto p(x_3=0|w)p(w) = 3(1-w)w^2
\end{align}

Wenn es integriert ist, wird es 1/4, und wenn es standardisiert ist, wird es wie folgt.

\begin{align}
p(w|x_1=1, x_2=1, x_3=0) = 12(1-w)w^2
\end{align}

Auf diese Weise können Sie die Verteilung der Wahrscheinlichkeit ermitteln, mit der Münzen auf den Kopf gestellt werden.

Implementierung des Bayesian Update-Beispiels

Lassen Sie uns das oben gezeigte Beispiel in Python implementieren. Für die Implementierung habe ich auf [hier] verwiesen (https://rmizutaa.hatenablog.com/entry/2019/02/15/200700%EF%BC%89).

import sympy
import numpy as np
import matplotlib.pyplot as plt

np.random.rand()

#Vordere und hintere Reihe von Münzen
xs = [1, 1, 0]  #Vorne, vorne, hinten

#Die vorherige Verteilung ist eine informationslose vorherige Verteilung
prior_prob = 1

#Symbol zum Integrieren
w = sympy.Symbol('w')

#Initialisieren
#Erforderlich, wenn wiederholt mit einem Jupyter-Notebook ausgeführt wird
posterior_prob = None

#Sequentielle Berechnung der posterioren Verteilung
for x in xs:
    
    #Berechnung der posterioren Verteilung (nicht standardisiert)
    if x==1:
        posterior_prob = w*prior_prob
    else:
        posterior_prob = (1-w)*prior_prob
        
    #Standardisierung
    Z = sympy.integrate(posterior_prob, (w, 0, 1))
    posterior_prob = posterior_prob/Z
        
    #Ersatz der vorherigen Verteilung
    prior_prob = posterior_prob
    
plt.figure(figsize=(5, 4))
X = np.linspace(0, 1, 100)
plt.plot(X, [posterior_prob.subs(w, i) for i in X])
plt.xlabel("w")
plt.show()
スクリーンショット 2020-01-23 22.03.53.png

Bonus

Versuchen wir zu schätzen, wann etwas mehr Daten vorhanden sind. Erhöhen Sie mit einer Münze mit einer Wahrscheinlichkeit von 0,35 die Anzahl der Versuche auf 30 und schätzen Sie. Wenn die Daten zunehmen, wird die Schätzung genauer und die Verteilung wird schärfer.

import sympy
import numpy as np
import matplotlib.pyplot as plt

np.random.rand(0)


def bernoulli_sampler(w, n):
    """w ist die Wahrscheinlichkeit, dass 1 ausgegeben wird, und n ist die Anzahl der zu erzeugenden Daten."""
    xs = np.random.rand(n)
    xs = xs<w
    return xs.astype("int")


#Vordere und hintere Reihe von Münzen
xs = bernoulli_sampler(0.35, 30)

#Die vorherige Verteilung ist eine informationslose vorherige Verteilung
prior_prob = 1

#Symbol zum Integrieren
w = sympy.Symbol('w')

#Initialisieren
#Erforderlich, wenn wiederholt mit einem Jupyter-Notebook ausgeführt wird
posterior_prob = None

#Sequentielle Berechnung der posterioren Verteilung
for x in xs:
    
    #Berechnung der posterioren Verteilung (nicht standardisiert)
    if x==1:
        posterior_prob = w*prior_prob
    else:
        posterior_prob = (1-w)*prior_prob
        
    #Standardisierung
    Z = sympy.integrate(posterior_prob, (w, 0, 1))
    posterior_prob = posterior_prob/Z

    #Ersatz der vorherigen Verteilung
    prior_prob = posterior_prob

plt.figure(figsize=(5, 4))
X = np.linspace(0, 1, 100)
plt.plot(X, [posterior_prob.subs(w, i) for i in X])
plt.xlabel("w")
plt.show()
スクリーンショット 2020-01-23 22.06.27.png

abschließend

Der Punkt ist, dass B und C unabhängig und bedingte Unabhängigkeit sind, wenn A gegeben ist.

Recommended Posts

Bayes Update
Django-Update
Bayes passend
Python-Update (2.6-> 2.7)
Datenrahmen aktualisieren
Update, Upgrade-Zusammenfassung
Scikit-learn einfach aktualisieren.
youtube-dl Update-Methode