[PYTHON] Analyse par raisonnement bayésien (2) ... Test d'algorithme de découverte de mise en conserve

Exemple d'analyse du raisonnement bayésien; Y a-t-il des étudiants qui ont fait de la mise en conserve?

Du raisonnement bayésien expérimenté en Python

"Inférence de Bayes expérimentée en Python"

Y a-t-il un étudiant qui a conservé le raisonnement bayésien? Considérez le problème.

Question: Quel est le pourcentage d'étudiants qui ont mis en conserve?

Le paramètre de la question consiste à utiliser la distribution binomiale pour savoir à quelle fréquence l'étudiant a mis en conserve pendant l'examen, mais si vous y réfléchissez, vous ne pouvez pas honnêtement dire que vous l'avez fait, alors la "découverte de Canning" Je pense à un algorithme.

"Algorithme de découverte de mise en conserve" Lors de l'entrevue après le test, l'étudiant jette des pièces invisibles à l'intervieweur. Si le tableau apparaît ici, laissez les élèves accepter de répondre honnêtement. Si cela s'avère, lancez à nouveau la pièce afin que vous ne puissiez pas la voir. Puis, quand le recto apparaît: "Oui, je l'ai fait." Quand le verso apparaît, je réponds "Non, je ne l'ai pas fait." En d'autres termes

1ère fois Deuxième fois La personne qui a mis en conserve Ceux qui n'ont pas
table -- A: en conserve Réponse: pas fait
retour table A: en conserve A: en conserve
retour retour Réponse: pas fait Réponse: pas fait

En conséquence, la moitié des données est le résultat de jetons de monnaie et les étudiants sont protégés de la vie privée. De plus, puisque j'ai obtenu le consentement pour répondre honnêtement la première fois, je ne mentirai pas. A partir de ce résultat, la distribution postérieure de la fréquence réelle peut être obtenue.

Ici, une distribution binomiale est utilisée. Il existe deux paramètres pour la distribution binomiale. N représentant le nombre d'essais et la probabilité p qu'un événement se produise dans un essai. La distribution binomiale est la même distribution discrète que la distribution de Poisson, mais contrairement à la distribution de Poisson, les probabilités sont attribuées à des entiers de 0 à N. (La distribution de Poisson attribue des probabilités à tous les nombres entiers de 0 à l'infini) La fonction de masse stochastique est

P( X = k ) =  {{N}\choose{k}}  p^k(1-p)^{N-k}
X \sim \text{Bin}(N,p)

X est une variable stochastique et p et N sont des paramètres. En d'autres termes, si X suit une distribution binomiale, cela signifie que le nombre de fois qu'un événement se produit dans N essais est X, et si p est grand (dans la plage de 0 à 1), de nombreux événements sont susceptibles de se produire. ..

# -*- coding: utf-8 -*-

import pymc3 as pm
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt

#Le vrai pourcentage p de la personne en conserve est échantillonné à partir de la distribution précédente,
#Distribution uniforme (uniforme) car p est inconnu(0, 1)). Le nombre d'élèves N est de 100.
N = 100
with pm.Model() as model:
    p = pm.Uniform("freq_cheating", 0, 1)

#Attribuez une variable stochastique à 100 élèves (1 est en conserve, 0 ne l'est pas),
#Il suit la distribution de Bernoulli.
with model:
    true_answers = pm.Bernoulli("truths", p, shape=N, testval=np.random.binomial(1, 0.5, N))

#Modéliser le premier lancer de pièces de l'élève dans les étapes de l'algorithme de confidentialité
#p=1/Effectuez la distribution de Bernoulli de 2 100 fois.
with model:
    first_coin_flips = pm.Bernoulli("first_flips", 0.5, shape=N, testval=np.random.binomial(1, 0.5, N))
print(first_coin_flips.tag.test_value)

#Modélisez le deuxième lancer de pièces de la même manière.
with model:
    second_coin_flips = pm.Bernoulli("second_flips", 0.5, shape=N, testval=np.random.binomial(1, 0.5, N))

import theano.tensor as tt

with model:
    val = first_coin_flips*true_answers + (1 - first_coin_flips)*second_coin_flips
    observed_proportion = pm.Deterministic("observed_proportion", tt.sum(val)/float(N))

print(observed_proportion.tag.test_value)

#À la suite de l'entretien, 35 personnes sur 100 (X) ont répondu qu'elles «conservaient».
#À partir de cet algorithme, si personne ne met en conserve, 25 personnes diront qu'elles le sont.
#Si tout le monde kanning, 75 diront qu'ils kanning
#à l'intérieur de ça,

X = 35
with model:
    observations = pm.Binomial("obs", N, observed_proportion, observed=X)

#C'est un calcul. Pour spyder, noyaux=J'en ai besoin d'un. Avec jupyter notebook, vous n'avez pas besoin de cœurs.
with model:
    step = pm.Metropolis(vars=[p])
    trace = pm.sample(40000, step=step,cores=1)
    burned_trace = trace[15000:]
    
p_trace = burned_trace["freq_cheating"][15000:]
plt.hist(p_trace, histtype="stepfilled", density=True, alpha=0.85, bins=30, 
         label="posterior distribution", color="#348ABD")
plt.vlines([.05, .35], [0, 0], [5, 5], alpha=0.3)
plt.xlim(0, 1)
plt.legend()
plt.show()

Le résultat. 0812_jupyter_result.png

Dans ce graphique, l'axe horizontal est la valeur de p (la personne qui a mis en conserve) et l'axe vertical est la fréquence. En regardant le graphique de la probabilité postérieure de la fréquence réelle (p) de mise en conserve confirmée par «l'algorithme de découverte de la mise en conserve», les résultats sont larges. Alors vous pourriez penser que vous ne savez rien. Cependant, seul cela peut être vu d'ici. La valeur de p est donnée dans une distribution uniforme, mais "l'algorithme de découverte de mise en conserve" sous-estime la valeur de $ p = 0 $. En d'autres termes, cela signifie qu'il n'y a personne qui a mis en boîte $ p = 0 $. Étonnamment, cet algorithme détermine que "la mise en conserve doit avoir existé"! !!

Si vous faites ce calcul avec spyder, cela prendra beaucoup de temps et il est difficile de calculer avec un seul thread. Je le fais avec PyMC3, mais le backend utilise theano, et il n'y a pas beaucoup d'informations sur theano, donc je ne sais pas comment calculer avec le multithreading. Au fait, avec jupyter notebook, vous pouvez calculer avec le multi-thread sans rien faire, donc si vous n'êtes pas particulier à ce sujet, calculons avec jupyter notebook. Le backend de «PyMC4» est «TensorFlow», donc quand j'aurai fini d'étudier ce livre, je le changerai en «PyMC4».

Recommended Posts

Analyse par raisonnement bayésien (2) ... Test d'algorithme de découverte de mise en conserve
Analyse par raisonnement bayésien (1) ... Quel est le meilleur, A ou B?