假设我想在 PyMC 中的两个变量 ab 上放置一个自定义先验,例如:
p(a,b)∝(a+b)^(−5/2)
(对于这种先验选择背后的动机,请参阅 this answer )

这可以在 PyMC 中完成吗?如果是这样怎么办?

例如,我想在下面的模型中在 ab 上定义这样的先验。

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
  • 在 PyMC2 中,我还需要坚持 Theano 表示法吗?
  • 最后,我以后如何告诉我的 Beta 分布 alphabeta 有来自这个多元分布的先验?

    导入 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 中,诀窍是将 ab 参数放在一起:

    # 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/

    10-12 18:52