"In Python erlebte Bayes-Inferenz"
Gibt es einen Studenten, der sich mit Bayes'schen Argumenten auseinandersetzt? Betrachten Sie das Problem.
Die Einstellung der Frage besteht darin, mithilfe der Binomialverteilung herauszufinden, wie oft der Schüler während der Prüfung eingemacht hat. Wenn Sie jedoch darüber nachdenken, können Sie nicht ehrlich sagen, dass Sie es getan haben. Die folgende "Canning-Entdeckung" Ich denke über einen Algorithmus nach.
"Canning Discovery-Algorithmus" Beim Interview nach dem Test wirft der Student Münzen, die für den Interviewer unsichtbar sind. Wenn die Tabelle hier angezeigt wird, lassen Sie die Schüler zustimmen, ehrlich zu antworten. Wenn sich herausstellt, werfen Sie die Münze erneut, damit Sie sie nicht sehen können. Wenn dann die Vorderseite erscheint: "Ja, ich habe es getan." Wenn die Rückseite erscheint, antworte ich: "Nein, ich habe es nicht getan." Mit anderen Worten
1. Mal | Zweites Mal | Die Person, die eingemacht hat | Diejenigen, die nicht haben |
---|---|---|---|
Tabelle | -- | A: Eingemacht | Antwort: Nicht fertig |
zurück | Tabelle | A: Eingemacht | A: Eingemacht |
zurück | zurück | Antwort: Nicht fertig | Antwort: Nicht fertig |
Infolgedessen ist die Hälfte der Daten das Ergebnis des Münzwurfs, und die Schüler sind vor der Privatsphäre geschützt. Da ich die Zustimmung erhalten habe, das erste Mal ehrlich zu antworten, werde ich auch nicht lügen. Aus diesem Ergebnis kann die posteriore Verteilung der wahren Frequenz erhalten werden.
Hier wird eine Binomialverteilung verwendet. Es gibt zwei Parameter für die Binomialverteilung. N repräsentiert die Anzahl der Versuche und die Wahrscheinlichkeit p, dass ein Ereignis in einem Versuch auftritt. Die Binomialverteilung ist dieselbe diskrete Verteilung wie die Poisson-Verteilung, aber im Gegensatz zur Poisson-Verteilung werden Wahrscheinlichkeiten Ganzzahlen von 0 bis N zugewiesen. (Die Poisson-Verteilung weist allen ganzen Zahlen von 0 bis unendlich Wahrscheinlichkeiten zu.) Die stochastische Massenfunktion ist
P( X = k ) = {{N}\choose{k}} p^k(1-p)^{N-k}
X \sim \text{Bin}(N,p)
X ist eine stochastische Variable und p und N sind Parameter. Mit anderen Worten, wenn X einer Binomialverteilung folgt, bedeutet dies, dass die Häufigkeit, mit der ein Ereignis in N Versuchen auftritt, X ist, und wenn p groß ist (im Bereich von 0 bis 1), treten wahrscheinlich viele Ereignisse auf. ..
# -*- coding: utf-8 -*-
import pymc3 as pm
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt
#Der wahre Prozentsatz p der eingemachten Person wird aus der vorherigen Verteilung entnommen.
#Gleichmäßige Verteilung (Uniform), da p unbekannt ist(0, 1)). Die Anzahl der Schüler N beträgt 100.
N = 100
with pm.Model() as model:
p = pm.Uniform("freq_cheating", 0, 1)
#Weisen Sie 100 Schülern eine stochastische Variable zu (1 ist in Dosen, 0 nicht),
#Es folgt die Bernoulli-Verteilung.
with model:
true_answers = pm.Bernoulli("truths", p, shape=N, testval=np.random.binomial(1, 0.5, N))
#Modellierung des ersten Münzwurfs des Schülers in den Schritten des Datenschutzalgorithmus
#p=1/Führen Sie die Bernoulli-Verteilung von 2 100 Mal durch.
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)
#Modellieren Sie den zweiten Münzwurf auf die gleiche Weise.
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)
#Als Ergebnis des Interviews antworteten 35 von 100 Personen (X), dass sie "eingemacht" hätten.
#Nach diesem Algorithmus werden 25 Personen sagen, dass sie es sind, wenn niemand Konserven macht.
#Wenn jeder kanninging, würden 75 sagen, dass sie kanning.
#darin,
X = 35
with model:
observations = pm.Binomial("obs", N, observed_proportion, observed=X)
#Es ist eine Berechnung. Für Spyder Kerne=Ich brauche einen. Mit dem Jupiter-Notebook benötigen Sie keine Kerne.
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()
Das Ergebnis.
In diesem Diagramm ist die horizontale Achse der Wert von p (die Person, die eingemacht hat) und die vertikale Achse ist die Frequenz. Betrachtet man das Diagramm der posterioren Wahrscheinlichkeit der wahren Häufigkeit (p) der Konservenherstellung, die durch den "Algorithmus zur Entdeckung der Konservenherstellung" bestätigt wurde, so sind die Ergebnisse breit. Sie könnten also denken, Sie wissen nichts. Von hier aus ist jedoch nur dies zu sehen. Der Wert von p wird in einer gleichmäßigen Verteilung angegeben, aber der "Canning Discovery Algorithmus" unterschätzt den Wert von $ p = 0 $. Mit anderen Worten bedeutet dies, dass es niemanden gibt, der $ p = 0 $ eingemacht hat. Überraschenderweise stellt dieser Algorithmus fest, dass "Konserven vorhanden sein müssen"! !!
Wenn Sie diese Berechnung mit spyder
durchführen, wird dies viel Zeit in Anspruch nehmen und es ist schwierig, mit einem einzelnen Thread zu berechnen. Ich mache es mit PyMC3
, aber das Backend verwendet theano
und es gibt nicht viele Informationen zu theano
, so dass ich nicht weiß, wie ich mit Multithreading rechnen soll. Übrigens, mit "jupyter notebook" können Sie mit Multithread rechnen, ohne etwas zu tun. Wenn Sie sich also nicht besonders sicher sind, lassen Sie uns mit "jupyter notebook" rechnen.
Das Backend von "PyMC4" ist "TensorFlow". Wenn ich mit dem Studium dieses Buches fertig bin, werde ich es in "PyMC4" ändern.