在 PyMC 中设置随机变量的界限

Putting bounds on stochastic variables in PyMC

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

但是,指数分布可以 return 高于 1 的值,这会导致 A 失效。有没有一种方法可以限制 p_A 的输出,而不必在我自己的 @pymc.stochastic 装饰函数中重新实现伯努利或指数分布?

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

对于遇到此问题的任何其他迷失灵魂:

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

对于 certain parameter values,它近似于指数函数的形状(并且可以对二项式和法线做同样的事情),但限制为 [0 1]。不过,可能只对用数字做事有用,因为我想用它做任何分析都很痛苦。

PyMC 提供边界。以下内容也应该有效:

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