J'ai une variable A
qui est distribuée Bernoulli, A = pymc.Bernoulli('A', p_A)
, mais je n'ai pas une valeur dure pour p_A
et que vous voulez échantillonner pour cela. Je sais qu'il devrait être petit, donc je veux utiliser une distribution exponentielle p_A = pymc.Exponential('p_A', 10)
. Cependant, la distribution exponentielle peut renvoyer des valeurs supérieures à 1, ce qui déclencherait une erreur A
. Existe-t-il un moyen de limiter la sortie de p_A
sans avoir à réimplémenter les distributions Bernoulli ou Exponential dans ma propre fonction @pymc.stochastic
-decorated?Mettre des bornes sur les variables stochastiques dans PyMC
Répondre
Pour toute autre âmes perdues qui viennent à travers ceci:
Je pense que la meilleure solution pour mes besoins (c'est que j'utilisais seulement la distribution exponentielle parce que les probabilités que je cherchais à générer étaient probablement petites, plutôt que par commodité mathématique) était d'utiliser une fonction bêta à la place .
Pour certain parameter values, il se rapproche de la forme d'une fonction exponentielle (et peut faire la même chose pour les binômes et les normales), mais il est limité à [0 1]. Probablement seulement utile pour faire des choses numériquement, cependant, car j'imagine que c'est une douleur de faire une analyse avec.
Vous pouvez utiliser une fonction déterministe pour tronquer la distribution exponentielle. Personnellement, je crois que ce serait mieux si vous utilisez une distribution qui est lié entre 0 et 1, mais pour résoudre exactement votre problème, vous pouvez le faire comme suit:
import pymc as pm
p_A = pm.Exponential('p_A',10)
@pm.deterministic
def p_B(p=p_A):
return min(1, p)
A = pm.Bernoulli('A', p_B)
model = dict(p_A=p_A, p_B=p_B, A=A)
S = pm.MCMC(model)
S.sample(1000)
p_B_trace = S.trace('p_B')[:]
Ma première tentative a été d'approcher la distribution exponentielle en utilisant une distribution bêta, 'a = 1',' b> 1'. Vous pouvez également trier approximativement une distribution de Poisson bornée. – Tunisia