Je fais du pymc3 et je voudrais créer des stochastiques personnalisés, mais il ne semble pas y avoir beaucoup de documentation sur la façon dont cela est fait. Je sais comment utiliser le as_op way, mais apparemment cela rend impossible l'utilisation de l'échantillonneur NUTS, auquel cas je ne vois pas l'avantage de pymc3 sur pymc.Comment écrire un déterministe ou stochastique personnalisé dans pymc3 avec theano.op?
Le tutoriel mentionne que cela peut être fait en héritant de theano.Op. Mais est-ce que quelqu'un peut me montrer comment cela fonctionnerait (je commence toujours à le faire)? J'ai deux stochastiques que je veux définir.
Le premier devrait être plus facile, il est un vecteur de dimension N F
qui n'a que des variables parentales constantes:
with myModel:
F = DensityDist('F', lambda value: pymc.skew_normal_like(value, F_mu_array, F_std_array, F_a_array), shape = N)
Je veux un biais distribution normale, ce qui ne semble pas être encore mis en œuvre dans pymc3, Je viens d'importer la version pymc2. Malheureusement, F_mu_array, F_std_array, F_a_array and F
sont tous des vecteurs N-dimensionnels, et la chose lambda ne semble pas fonctionner avec une liste N-dimension value
.
Premièrement, existe-t-il un moyen de faire de l'entrée lambda un réseau de dimension N? Si non, je suppose que je devrais définir le stochastique F
directement, et c'est là où je suppose que j'ai besoin de theano.Op pour le faire fonctionner.
Le deuxième exemple est une fonction plus compliquée d'autres stochastiques. Voici comment je veux le définir (à tort pour le 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)
Lorsque la fonction est R_forward(F,M,A,C,sw,N)
définie comme naïvement:
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
Ce probablement ne fonctionnera pas bien sûr. Je peux voir comment j'utiliserais as_op
, mais je veux préserver l'échantillonnage NUTS.
thx pour votre exemple. Personnellement, je suis un débutant complet avec pymc3 et je ne peux pas l'utiliser pour certaines tâches. Donc, je code pour pymc2 ... une telle honte ... S'il vous plaît pouvez-vous jeter un oeil sur mon cas http://stackoverflow.com/questions/42205123/how-to-fit-a-method-belonging-to-an-instance- avec-pymc3, pour voir si vous pouvez aider? J'ai vu votre exemple il y a quelque temps, mais je l'ai trouvé complexe et je ne l'ai pas encore appliqué à mon cas parce que j'espérais que quelqu'un proposerait quelque chose de plus simple. Il me semblerait étrange que pymc3 n'ait pas de réponse pratique ... Il me semble plus probable qu'il me manque quelque chose d'évident. –
Même les tentatives les plus récentes pour éviter d'utiliser un theano.op, les commentaires suivants, sont des échecs. La mécanique reste mystérieuse ... –
J'ai répondu à http://stackoverflow.com/a/43449084/7132951 –