~~ MCMC sollte gemacht werden! Es gibt kein Tsukkomi.
Wie Sie wissen, verfügt scipy über viele vordefinierte Wahrscheinlichkeitsdichtefunktionen, mit denen Sie problemlos Wahrscheinlichkeitsdichtefunktionen abtasten, zeichnen und vieles mehr können.
Zum Beispiel
stats.norm.rvs(loc=50, scale=20, size=1000)
In diesem Fall können 1000 Proben aus einer Normalverteilung mit einem Durchschnitt von 50 und einer Standardabweichung von 20 erhalten werden.
x = np.linspace(0, 100, 100)
px = stats.norm.pdf(x, loc=50, scale=20)
plt.plot(x, px)
Dann können Sie auch die Normalverteilung mit $ 0 <x <100 $ veranschaulichen.
Wie können Sie also aus Ihrer eigenen Wahrscheinlichkeitsdichtefunktion eine Stichprobe erstellen, die in scipy nicht vordefiniert ist? Im Fall der diskreten Verteilung wird es in Artikel von @ yk-tanigawa eingeführt, daher werden wir uns hier mit dem Fall der kontinuierlichen Verteilung befassen.
Unter der Annahme, dass die Normalverteilung nicht in scipy.stats definiert ist (sie ist tatsächlich definiert), finden Sie hier ein Beispiel, wie Sie sie selbst definieren und abtasten. Sie schreiben einfach die Funktion, die Sie definieren möchten, in die Funktion _pdf und erben von rv_continous.
from scipy import stats
import math
class gaussian(stats.rv_continuous):
def _pdf(self, x, mu, sigma):
normalize_factor = 1.0/(2.0*math.pi*sigma**2)**(1/2)
px = normalize_factor * math.exp(-(x-mu)**2/(2*sigma**2))
return px
gaussian = gaussian(name="gaussian", a=0.0)
sample_from_gaussian = gaussian.rvs(size=1, mu=10.0, sigma=1.0)
Bitte beachten Sie, dass die von Ihnen selbst definierte Wahrscheinlichkeitsdichtefunktion standardisiert werden muss. Wenn Sie es nicht standardisiert haben, können Sie [Rejection Sampling] verwenden (https://www.iwanttobeacat.com/entry/2018/03/24/225348).
(Selbst wenn Sie sich [Dokumentation] ansehen (https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.stats.rv_continuous.html), gibt es viele Gründe, warum a = 0 erforderlich ist. Ich weiß es nicht ...)
Recommended Posts