(Python) Valeur attendue ・ J'ai essayé de comprendre attentivement l'échantillonnage Monte Carlo

introduction

J'ai passé en revue les attentes concernant l'étude des statistiques bayésiennes.

Je me suis référé au livre suivant.

Quelle est la valeur attendue?

L'espérance est la valeur moyenne de $ f (x) $ sous la distribution de probabilité $ p (x) $ d'une fonction $ f (x) $. En tant que notation, écrivez $ E [f] $.

Dans la distribution discrète, il s'exprime comme suit.


E[f] = \sum_x p(x)f(x)

D'autre part, les variables continues peuvent être exprimées sous forme d'intégrales.


E[f] = \int p(x)f(x)dx

Entropie

La valeur attendue suivante pour la distribution de probabilité $ p (x) $ est appelée entropie.

\begin{align}
H[p(x)]& = - \sum_x p(x) ln(p(x))\\

\end{align}

Approximative avec somme finie (échantillonnage Monte Carlo)

Lorsque l'ensemble des échantillons extraits indépendamment de la distribution $ p (x) $ est $ \ bf {z} ^ {(n)} (n = 1, ..., N) $, les valeurs attendues sont les suivantes. Peut être approximé comme


E[f] = \frac{1}{L} \sum_{n=1}^{N}f(\bf{z}^{(N)})

Ce sera.

Prenons un exemple ici. exemple Considérons une distribution discrète telle que $ p (x = 1) = 0,3 et p (x = 1) = 0,7 $.

D'après la définition de l'entropie, l'entropie est

\begin{align}
H[p(x)]& = - \sum_x p(x) ln(p(x))\\
&=-(p(x=1)lnp(x=1) + p(x=0)lnp(x=0) )\\
&= -(\frac{3}{10}ln\frac{3}{10}+\frac{7}{10}ln\frac{7}{10})\\
&=0.610
\end{align}

Ce sera. Maintenant, calculons lors de l'approximation de cela avec une somme finie. La méthode random.uniform génère une valeur aléatoire entre 0 et 1 et $ x = 1 $ ou $ x = 2 $ selon qu'elle est supérieure ou non à $ p (x = 1) = 0,3 $. J'essaie de déterminer si c'est le cas. Et, le nombre de fois que $ x = 1,2 $ est compté par cnt.   Le programme sera le suivant. J'ai calculé 1000 fois à titre d'essai.

cnt = []
proba_1  =[]
proba_2  =[]
time = 1000
a = random.uniform(0,1)
exp =[]

for i in range(time):
    a = random.uniform(0,1)
    if a > p1:
        cnt = np.append(cnt,1)
    else:
        cnt = np.append(cnt, 0)
    proba_1 = np.append(proba_1, (i+1-sum(cnt))/(i+1))
    proba_2 = np.append(proba_2, sum(cnt)/(i+1))
    exp = np.append(exp, -(((i+1-sum(cnt))*math.log(p1))+((sum(cnt))*math.log(p2)))/(i+1))
 
plt.xlabel('time')
plt.ylabel('probability')
plt.plot(time_plot, proba_2, label="p2")
plt.plot(time_plot, proba_1, label="p1")
plt.legend()       

002.png

On a constaté qu'il converge vers $ p (x = 1) = 0,3 et p (x = 2) = 0,7 $ après environ 100 fois.

003.png

Il a été constaté que cela convergeait également vers environ 0,61 de la valeur attendue (= entropie) initialement obtenue après 100 fois.

Il a été confirmé qu'il n'y a pas de problème avec cette méthode d'approximation de la valeur attendue.

À la fin

Cette fois, c'était un exemple très simple, donc c'était facile à calculer et à confirmer. Cependant, dans les problèmes réels, il est souvent difficile d'obtenir analytiquement la valeur attendue. Par conséquent, je pense qu'il est utile de se rappeler que cet échantillonnage de Monte Carlo est approximatif.

Le texte intégral du programme est ici. https://github.com/Fumio-eisan/VI20200520

Recommended Posts

(Python) Valeur attendue ・ J'ai essayé de comprendre attentivement l'échantillonnage Monte Carlo
J'ai essayé de toucher Python (installation)
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter PLSA dans Python 2
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de toucher Python (syntaxe de base)
J'ai essayé d'implémenter la régression linéaire bayésienne par échantillonnage de Gibbs en python
(Apprentissage automatique) J'ai essayé de comprendre attentivement la régression linéaire bayésienne avec l'implémentation
J'ai essayé de comprendre l'arbre de décision (CART) pour classer soigneusement
Méthode #Monte Carlo pour trouver le rapport de circonférence en utilisant Python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'implémenter le tri sélectif en python
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
J'ai essayé de représenter graphiquement les packages installés en Python
Même les débutants veulent dire "Je comprends parfaitement Python"
Quand j'ai essayé d'introduire python3 dans atom, je suis resté coincé
J'ai essayé de résumer comment utiliser matplotlib de python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé Python> autopep8
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'implémenter un pseudo pachislot en Python
Suite ・ J'ai essayé de créer Slackbot après avoir étudié Python3
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le poker de Drakue en Python
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de déboguer.
J'ai essayé d'implémenter GA (algorithme génétique) en Python
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé Python> décorateur
[Python] J'ai essayé d'obtenir Json de squid ring 2
J'ai essayé d'accéder aux feuilles de calcul Google en utilisant Python
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé de trouver l'entropie de l'image avec python
Je veux initialiser si la valeur est vide (python)
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé LeetCode tous les jours 13. Roman to Integer (Python, Go)
[Chaîne de Markov] J'ai essayé de charger des émotions négatives dans Python.
[Chaîne de Markov] J'ai essayé de lire les citations en Python.
J'ai essayé "Comment obtenir une méthode décorée en Python"
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
[Python] J'ai essayé de visualiser la relation de suivi de Twitter