假设我想在 PyMC 中的两个变量 a
和 b
上放置一个自定义先验,例如:p(a,b)∝(a+b)^(−5/2)
(对于这种先验选择背后的动机,请参阅 this answer )
这可以在 PyMC 中完成吗?如果是这样怎么办?
例如,我想在下面的模型中在 a
和 b
上定义这样的先验。
import pymc as pm
# ...
# Code that defines the prior: p(a,b)∝(a+b)^(−5/2)
# ...
theta = pm.Beta("prior", alpha=a, beta=b)
# Binomials that share a common prior
bins = dict()
for i in xrange(N_cities):
bins[i] = pm.Binomial('bin_{}'.format(i), p=theta,n=N_trials[i], value=N_yes[i], observed=True)
mcmc = pm.MCMC([bins, ps])
更新
按照 John Salvatier 的建议,我尝试了以下操作(请注意,我在 PyMC2,虽然我很乐意切换到 PyMC3),但我的问题是:
Continuous
? Beta
分布 alpha
和 beta
有来自这个多元分布的先验?导入 pymc.Multivariate.Continuous
类 CustomPrior(Continuous):
"""
p(a,b)∝(a+b)^(−5/2)
:Parameters:
None
:Support:
2 positive floats (parameters to a Beta distribution)
"""
def __init__(self, mu, tau, *args, **kwargs):
super(CustomPrior, self).__init__(*args, **kwargs)
def logp(self, a,b):
return np.log(math.power(a+b),-5./2)
最佳答案
在 PyMC2 中,诀窍是将 a
和 b
参数放在一起:
# Code that defines the prior: p(a,b)∝(a+b)^(−5/2)
@pm.stochastic
def ab(power=-2.5, value=[1,1]):
if np.any(value <= 0):
return -np.Inf
return power * np.log(value[0]+value[1])
a = ab[0]
b = ab[1]
This notebook 有一个完整的例子。
关于python - PyMC 中的自定义先验,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23198247/