[PYTHON] Mise à jour Bayes

introduction

Je parlais de la mise à jour de Bayes dans l'atmosphère, alors j'ai voulu étudier correctement et je l'ai résumé. Ceci est le nième article de décoction.

référence

procédure

Mise à jour Bayes

Pour résumer grossièrement l'estimation bayésienne, la distribution des paramètres de la vraisemblance (= modèle) est estimée en utilisant le théorème bayésien au lieu de l'estimation ponctuelle par MLE. Le théorème de Bayes est exprimé par l'équation suivante.

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

p(x|w)Est la vraisemblance (= modèle),p(w)Est une distribution antérieure,p(x)Est la probabilité d'occurrence des données.p(w|x)Est appelé distribution postérieure. Cette formule est une formule que la distribution (distribution postérieure) du paramètre $ w $ lorsque la donnée $ x $ est donnée est obtenue en multipliant la distribution antérieure du paramètre $ w $ du modèle par la vraisemblance. ..

La mise à jour bayésienne est un mécanisme qui utilise le théorème bayésien pour mettre à jour séquentiellement la distribution postérieure. Le développement suivant est basé sur ici. Tout d'abord, nous transformons le théorème bayésien.

\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}

Jusqu'à ce point, il tient généralement.

Ensuite, supposons que B et C soient indépendants et conditionnellement indépendants étant donné A. Ensuite, nous obtenons l'équation suivante:

\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}

Maintenant, mettons $ w $ dans A, la première donnée observée $ x_1 $ dans B, et la deuxième donnée observée $ x_2 $ dans C. «$ X_1 $ et $ x_2 $ sont indépendants et une indépendance conditionnelle étant donné $ w $» signifie que les données observées sont générées indépendamment à partir de la distribution et que la vraisemblance (= modèle) est également $ x_1. Cela signifie modéliser pour que $ et $ x_2 $ soient indépendants. Notez que cette propriété n'est pas valable pour les données corrélées avec des séries chronologiques. À ce stade, l'équation suivante est vraie.

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

La distribution a posteriori de $ w $ étant donné les données $ x_1 $ et $ x_2 $ est le théorème bayésien de $ x_2 $ et $ w $ avec $ p (w | x_1) $ comme distribution antérieure. Je vais! En utilisant cette relation, donnez une distribution a priori appropriée → trouvez la distribution a posteriori lorsque les données sont données → remplacez la distribution a posteriori par la distribution a priori → trouvez la distribution a posteriori lorsque les données sont données → ... et ainsi de suite. Vous pouvez mettre à jour la distribution. C'est ainsi que fonctionne la mise à jour de Bayes.

Exemple de mise à jour de Bayes

Calculons la mise à jour bayésienne en nous référant à ici.

Prenons une pièce déformée. Estimons la probabilité que cette pièce apparaisse sur la table. Supposons que le rouleau de pièces soit obtenu indépendamment dans chaque essai. Tout d'abord, considérez la probabilité, ou le modèle, du rouleau de la pièce. Étant donné que le recto et le verso de la pièce sont des variables binaires, ils suivent la distribution de Bernoulli. Par conséquent, la probabilité est une distribution de Bernoulli. Faites correspondre le recto à $ x = 1 $ et le verso à $ x = 0 $. $ w $ est un nombre réel entre 0 et 1 et correspond à la probabilité même que le tableau apparaisse. Par conséquent, la distribution de $ w $ obtenue par la mise à jour bayésienne elle-même est la distribution de la probabilité d'apparition du tableau.

La distribution de Bernoulli peut être écrite comme suit:

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

Supposons que la distribution antérieure soit $ p (w) = 1 $ en tant que distribution antérieure sans information. $ p (x) $ est inconnu, mais si vous vous concentrez sur $ w $, c'est une constante standardisée, donc elle peut être calculée automatiquement à partir de la condition que l'intégration de $ p (w | x) $ est 1.

Maintenant, secouons la pièce.

1ère fois: Table

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

Il a déjà été normalisé car il devient 1 lorsqu'il est intégré de 0 à 1.

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

C'est la deuxième distribution précédente $ p (w) = p (w | x_1 = 1) = w $.

Deuxième fois: Table

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

Lorsqu'il est intégré, il devient 1/3, donc lorsqu'il est standardisé, il devient comme suit.

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

Cela donne la troisième distribution antérieure $ p (w) = p (w | x_1 = 1, x_2 = 1) = 3w ^ 2 $.

Troisième fois: retour

\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}

Lorsqu'il est intégré, il devient 1/4, donc lorsqu'il est standardisé, il devient comme suit.

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

De cette façon, vous pouvez trouver la distribution de la probabilité que les pièces soient retournées $ w $.

Exemple d'implémentation de la mise à jour bayésienne

Implémentons l'exemple vu ci-dessus en Python. Pour la mise en œuvre, je me suis référé à ici.

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

np.random.rand()

#Série avant et arrière de pièces
xs = [1, 1, 0]  #Avant, avant, arrière

#La distribution antérieure est une distribution antérieure sans information
prior_prob = 1

#Symbole à intégrer
w = sympy.Symbol('w')

#Initialiser
#Requis lors de l'exécution répétée avec le notebook Jupyter
posterior_prob = None

#Calcul séquentiel de la distribution postérieure
for x in xs:
    
    #Calculer la distribution postérieure (non standardisée)
    if x==1:
        posterior_prob = w*prior_prob
    else:
        posterior_prob = (1-w)*prior_prob
        
    #Standardisation
    Z = sympy.integrate(posterior_prob, (w, 0, 1))
    posterior_prob = posterior_prob/Z
        
    #Remplacement de la distribution antérieure
    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

prime

Essayons d'estimer quand il y a un peu plus de données. Avec une pièce dont la probabilité d'apparaître sur la table est de 0,35, augmentez le nombre d'essais à 30 et faites une estimation. À mesure que les données augmentent, l'estimation devient plus précise et la distribution devient plus précise.

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

np.random.rand(0)


def bernoulli_sampler(w, n):
    """w est la probabilité que 1 soit produit, et n est le nombre de données à générer."""
    xs = np.random.rand(n)
    xs = xs<w
    return xs.astype("int")


#Série avant et arrière de pièces
xs = bernoulli_sampler(0.35, 30)

#La distribution antérieure est une distribution antérieure sans information
prior_prob = 1

#Symbole à intégrer
w = sympy.Symbol('w')

#Initialiser
#Requis lors de l'exécution répétée avec le notebook jupyter
posterior_prob = None

#Calcul séquentiel de la distribution postérieure
for x in xs:
    
    #Calculer la distribution postérieure (non standardisée)
    if x==1:
        posterior_prob = w*prior_prob
    else:
        posterior_prob = (1-w)*prior_prob
        
    #Standardisation
    Z = sympy.integrate(posterior_prob, (w, 0, 1))
    posterior_prob = posterior_prob/Z

    #Remplacement de la distribution antérieure
    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

en conclusion

Le fait est que B et C sont indépendants et conditionnels étant donné A.

Recommended Posts

Mise à jour Bayes
mise à jour de Django
Raccord Bayes
Mise à jour Python (2.6-> 2.7)
mettre à jour le dataframe
mise à jour, résumé de la mise à niveau
Mettez facilement à jour Scikit-learn.
méthode de mise à jour youtube-dl