Verwendung empirischer Prioritäten in PyMC

8

Ich verwende PyMC, um die posteriore Verteilung abzutasten, und bin auf eine Straßensperre gestoßen, bei der Priors aus Samples verwendet werden, keine Modelle. Meine Situation ist wie folgt:

  • Ich habe einige empirische Daten für einen Parameter aus dem ich eine Wahrscheinlichkeitsverteilung p (z) berechne . Es ist kein Modell / keine Parametrisierung für die Verteilung von z bekannt . Ich habe nur empirische Werte. Es ist bekannt, dass z zwischen 0 und 30 liegt.zp(z)zz
  • Ich habe einige neue Beobachtungen x und berechne die Wahrscheinlichkeit p(x|z) auch empirisch.
  • Ich möchte, dass die hintere Verteilung mit den neuen Daten oben aktualisiert wird. (Dieser Posterior wird zum neuen Prior für die nächsten Beobachtungen. Spülen und wiederholen.)

Betrachten Sie zum Beispiel Folgendes:

import numpy as np
import matplotlib.pyplot as plt

# Ignore the fact that I'm using a mixture model. For all practical
# purposes, I do not know how this is generated. 
old_data = np.array([3 * np.random.randn(1000) + 20, 
                     3 * np.random.randn(1000) + 5,
                     4 * np.random.randn(1000) + 10])

new_data = np.array([4 * np.random.randn(50) + 8, 
                     2 * np.random.randn(50) + 17])

plt.hist(filter(lambda x: 0 <= x <= 30, old_data.flatten()), 
         bins=range(0, 30), normed=True, alpha=0.5)
plt.hist(filter(lambda x: 0 <= x <= 30, new_data.flatten()), 
         bins=range(0, 30), normed=True, alpha=0.5)
plt.legend(['p(z)', 'p(x|z)'])

Bei PyMC verwenden alle vorhandenen Quellen, die ich gefunden habe (zum Beispiel dieses Kapitel von Bayesian für Hacker), eine Normalverteilung für die Beobachtungen ( observations = pm.Normal("obs", center_i, tau_i, value=data, observed=True)) und eine einheitliche und normale vorherige Verteilung für die Präzision bzw. die Mittelwerte.

Ich bin mir nicht sicher, wie ich in PyMC behaupten soll, dass mein Prior diese Distribution hier und kein Modell ist. Ich habe auch versucht, den @StochasticDekorator mit zu verwendenobserved=True , aber ich glaube nicht, dass ich es vollständig verstehe. Außerdem kann ich immer noch keinen Weg finden, um die Angabe eines Modells zu vermeiden.

Verstehe ich den Zweck einer MCMC-Bibliothek grundlegend falsch? Wenn ja, wie soll ich vorgehen?

Alles, was ich wirklich möchte, ist, meine vorherige Überzeugung mit den neuen Beobachtungen zu aktualisieren, aber ich denke nicht, dass die Lösung so einfach ist wie das Multiplizieren der beiden Histogramme (und das Normalisieren).

jake
quelle
1
Dies ist eine großartige Frage, und ich würde gerne selbst eine Antwort haben. Bist du zu einem Schluss gekommen, seit du gepostet hast?
DCS

Antworten:

2

Wenn Sie bereits ein vorheriges und eine Wahrscheinlichkeit , können Sie das hintere leicht finden, indem Sie diese multiplizieren und normalisieren: p(θ)p(x|θ)p(θ|x)

p(θ|x)=p(θ)p(x|θ)p(x)p(θ)p(x|θ)

https://en.wikipedia.org/wiki/Posterior_probability

Der folgende Code zeigt die Schätzung eines als Histogramm dargestellten Seitenzahns, sodass er als nächster Prior verwendet werden kann:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# using Beta distribution instead on Normal to get finite support
support_size=30
old_data=np.concatenate([np.random.beta(70,20,1000), 
                     np.random.beta(10,40,1000),
                     np.random.beta(80,80,1000)])*support_size
new_data=np.concatenate([np.random.beta(20,10,1000), 
                     np.random.beta(10,20,1000)])*support_size

# convert samples to histograms
support=np.arange(support_size)
old_hist=np.histogram(old_data,bins=support,normed=True)[0]
new_hist=np.histogram(new_data,bins=support,normed=True)[0]

# obtain smooth estimators from samples
soft_old=gaussian_kde(old_data,bw_method=0.1)
soft_new=gaussian_kde(new_data,bw_method=0.1)

# posterior histogram (to be used as a prior for the next batch)
post_hist=old_hist*new_hist
post_hist/=post_hist.sum()

# smooth posterior
def posterior(x):
    return soft_old(x)*soft_new(x)/np.sum(soft_old(x)*soft_new(x))*x.size/support_size

x=np.linspace(0,support_size,100)

plt.bar(support[:-1],old_hist,alpha=0.5,label='p(z)',color='b')
plt.bar(support[:-1],new_hist,alpha=0.5,label='p(x|z)',color='g')
plt.plot(x,soft_old(x),label='p(z) smoothed',lw=2)
plt.plot(x,soft_new(x),label='p(x|z) smoothed',lw=2)
plt.legend(loc='best',fontsize='small')
plt.show()

plt.bar(support[:-1],post_hist,alpha=0.5,label='p(z|x)',color='r')
plt.plot(x,soft_old(x),label='p(z) smoothed',lw=2)
plt.plot(x,soft_new(x),label='p(x|z) smoothed',lw=2)
plt.plot(x,posterior(x),label='p(z|x) smoothed',lw=2)
plt.legend(loc='best',fontsize='small')
plt.show()

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Wenn Sie jedoch Ihre empirischen Daten mit einigen MCMC-Modellen kombinieren möchten, sollten Sie sich das Potenzial von PyMC ansehen. Eine der Hauptanwendungen sind "Soft Data". Bitte aktualisieren Sie Ihre Frage, wenn Sie eine entsprechende Antwort benötigen.

Andris Birkmanis
quelle