Ich mache etwas pymc3 und ich möchte benutzerdefinierte Stochastik erstellen, aber es scheint nicht viel Dokumentation darüber zu sein, wie es gemacht wird. Ich weiß, wie man die as_op way verwendet, aber anscheinend macht es das unmöglich, den NUTS-Sampler zu verwenden, in welchem Fall ich nicht den Vorteil von pymc3 gegenüber pymc sehe.Wie schreibt man eine benutzerdefinierte Deterministische oder Stochastische in pymc3 mit theano.op?
Das Tutorial erwähnt, dass es getan werden kann, indem er von theano.Op erbt. Aber kann mir jemand zeigen, wie das funktionieren würde (ich fange immer noch an auf theano)? Ich habe zwei Stochastiken, die ich definieren möchte.
Die erste einfacher sein sollte, ist es ein N Dimension Vectors F
, die nur konstante Mutter Variablen hat:
with myModel:
F = DensityDist('F', lambda value: pymc.skew_normal_like(value, F_mu_array, F_std_array, F_a_array), shape = N)
ich eine Skew-Normalverteilung wollen, die noch in pymc3 umgesetzt zu werden scheint nicht, Ich habe gerade die pymc2-Version importiert. Leider sind F_mu_array, F_std_array, F_a_array and F
alle N-dimensionale Vektoren und das Lambda-Ding scheint nicht mit einer N-Dimension-Liste zu arbeiten value
.
Erstens, gibt es eine Möglichkeit, den Lambda-Eingang zu einem N-dimensionalen Array zu machen? Wenn nicht, würde ich den Stochastic F
direkt definieren müssen, und hier nehme ich an, dass ich theano.Op brauche, damit es funktioniert.
Das zweite Beispiel ist eine kompliziertere Funktion anderer Stochastik. Hier ist, wie ich will es definieren (fälschlicherweise im Moment):
with myModel:
ln2_var = Uniform('ln2_var', lower=-10, upper=4)
sigma = Deterministic('sigma', exp(0.5*ln2_var))
A = Uniform('A', lower=-10, upper=10, shape=5)
C = Uniform('C', lower=0.0, upper=2.0, shape=5)
sw = Normal('sw', mu=5.5, sd=0.5, shape=5)
# F from before
F = DensityDist('F', lambda value: skew_normal_like(value, F_mu_array, F_std_array, F_a_array), shape = N)
M = Normal('M', mu=M_obs_array, sd=M_stdev, shape=N)
# Radius forward-model (THIS IS THE STOCHASTIC IN QUESTION)
R = Normal('R', mu = R_forward(F, M, A, C, sw, N), sd=sigma, shape=N)
Wo die Funktion R_forward(F,M,A,C,sw,N)
ist naiv wie folgt definiert:
from theano.tensor import lt, le, eq, gt, ge
def R_forward(Flux, Mass, A, C, sw, num):
for i in range(num):
if lt(Mass[i], 0.2):
if lt(Flux[i], sw[0]):
muR = C[0]
else:
muR = A[0]*log10(Flux[i]) + C[0] - A[0]*log10(sw[0])
elif (le(0.2, Mass[i]) or le(Mass[i], 0.5)):
if lt(Flux[i], sw[1]):
muR = C[1]
else:
muR = A[1]*log10(Flux[i]) + C[1] - A[1]*log10(sw[1])
elif (le(0.5, Mass[i]) or le(Mass[i], 1.5)):
if lt(Flux[i], sw[2]):
muR = C[2]
else:
muR = A[2]*log10(Flux[i]) + C[2] - A[2]*log10(sw[2])
elif (le(1.5, Mass[i]) or le(Mass[i], 3.5)):
if lt(Flux[i], sw[3]):
muR = C[3]
else:
muR = A[3]*log10(Flux[i]) + C[3] - A[3]*log10(sw[3])
else:
if lt(Flux[i], sw[4]):
muR = C[4]
else:
muR = A[4]*log10(Flux[i]) + C[4] - A[4]*log10(sw[4])
return muR
Dies vermutlich nicht natürlich funktionieren. Ich kann sehen, wie ich as_op
verwenden würde, aber ich möchte die NUTS-Sampling beibehalten.
thx für Ihr Beispiel. Ich bin persönlich ein absoluter Anfänger mit pymc3 und kann es nicht für einige Aufgaben verwenden. Also, ich Code für Pymc2 ... so eine Schande ... Bitte können Sie einen Blick auf meinen Fall http://StackOverflow.com/Questions/42205123/How-to-Fit-a-method-belonging-in-a-instance- with-pymc3, um zu sehen, ob Sie helfen können? Ich habe dein Beispiel vor einer Weile gesehen, aber ich fand es komplex und ich habe es noch nicht auf meinen Fall angewandt, weil ich hoffte, dass jemand etwas einfacheres vorschlagen würde. Es würde mir peinlich erscheinen, ob pymc3 keine praktische Antwort haben würde ... Es scheint mir wahrscheinlicher, dass ich etwas Offensichtliches vermisse. –
Auch die neueren Versuche, die Verwendung eines theano.op zu vermeiden, sind nach den Kommentaren Fehler. Die Mechanik bleibt mysteriös ... –
habe ich in http://stackoverflow.com/a/43449084/7132951 geantwortet –