在PyMC

时间:2015-12-04 17:53:20

标签: python pymc

我有一个变量A,它是伯努利分发的,A = pymc.Bernoulli('A', p_A),但我没有p_A的硬值,想要为它进行抽样。我知道它应该很小,所以我想使用指数分布p_A = pymc.Exponential('p_A', 10)

但是,指数分布可以返回大于1的值,这会抛弃A。有没有办法限制p_A的输出,而不必在我自己的@pymc.stochastic - 装饰函数中重新实现伯努利或指数分布?

3 个答案:

答案 0 :(得分:3)

您可以使用确定性函数截断指数分布。我个人认为如果你使用一个绑定在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')[:]

答案 1 :(得分:1)

PyMC提供界限。以下内容也应该起作用:

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

答案 2 :(得分:0)

对于遇到此事的任何其他失落的灵魂:

对于我的目的,我认为最好的解决方案(也就是说,我只使用指数分布,因为我想要生成的概率可能很小,而不是出于数学方便)是改为使用Beta函数。

对于certain parameter values,它近似于指数函数的形状(并且可以对二项式和法线执行相同的操作),但是它与[0 1]有界。但是,可能只对数字处理有用,因为我认为用它进行任何分析都很痛苦。