Python PyMC中随机变量的上界

Python PyMC中随机变量的上界,python,pymc,Python,Pymc,我有一个贝努利分布的变量a,a=pymc.Bernoulli('a',p_a),但是我没有一个关于p_a的硬值,我想对它进行采样。我知道它应该很小,所以我想使用指数分布p_A=pymc.index('p_A',10) 但是,指数分布可以返回大于1的值,这将抛出A。在我自己的@pymc.randomic-修饰函数中,有没有一种方法可以在不重新实现伯努利分布或指数分布的情况下限制p_a的输出?您可以使用确定性函数截断指数分布。就我个人而言,我认为如果您使用一个介于0和1之间的分布会更好,但要准确地解

我有一个贝努利分布的变量
a
a=pymc.Bernoulli('a',p_a)
,但是我没有一个关于
p_a
的硬值,我想对它进行采样。我知道它应该很小,所以我想使用指数分布
p_A=pymc.index('p_A',10)


但是,指数分布可以返回大于1的值,这将抛出
A
。在我自己的
@pymc.randomic
-修饰函数中,有没有一种方法可以在不重新实现伯努利分布或指数分布的情况下限制
p_a
的输出?

您可以使用确定性函数截断指数分布。就我个人而言,我认为如果您使用一个介于0和1之间的分布会更好,但要准确地解决您的问题,您可以执行以下操作:

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')[:]

可以使用确定性函数截断指数分布。就我个人而言,我认为如果您使用一个介于0和1之间的分布会更好,但要准确地解决您的问题,您可以执行以下操作:

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')[:]

对于任何其他遇到这种情况的迷失灵魂:

我认为最好的解决方案(也就是说,我只使用指数分布,因为我希望生成的概率可能很小,而不是出于数学上的方便)是使用贝塔函数


因为它近似于指数函数的形状(对于二项式和法线也可以这样做),但有界于[0 1]。不过,可能只对数字处理有用,因为我认为用它进行任何分析都是痛苦的。

对于任何其他遇到这种情况的迷失灵魂来说:

我认为最好的解决方案(也就是说,我只使用指数分布,因为我希望生成的概率可能很小,而不是出于数学上的方便)是使用贝塔函数


因为它近似于指数函数的形状(对于二项式和法线也可以这样做),但有界于[0 1]。不过,可能只对数字处理有用,因为我认为用PyMC进行任何分析都很痛苦。

PyMC提供了边界。以下方面也应起作用:

p_A = pymc.Bound(pymc.Exponential, upper=1)('p_A', lam=10)

PyMC提供了边界。以下方面也应起作用:

p_A = pymc.Bound(pymc.Exponential, upper=1)('p_A', lam=10)

我的第一次尝试是使用Beta分布来近似指数分布,
a=1
b>1
。您还可以对有界泊松分布进行近似排序。我的第一次尝试是使用β分布来近似指数分布,
a=1
b>1
。也可以对有界泊松分布进行近似排序。