我有兴趣计算贝叶斯因子来比较 PyMC 3 中的两个模型。根据这个网站,在 PyMC 2 中,该过程似乎相对简单:包括一个伯努利随机变量和一个自定义似然函数,它返回第一个模型的似然性当 Bernoulli 变量的值为 0 时,第二个模型的似然值是 1 时。然而,在 PyMC 3 中,事情变得更加复杂,因为随机节点需要是 Theano 变量。
我的两个似然函数是二项式,所以我想我需要重写这个类:
class Binomial(Discrete):
R"""
Binomial log-likelihood.
The discrete probability distribution of the number of successes
in a sequence of n independent yes/no experiments, each of which
yields success with probability p.
.. math:: f(x \mid n, p) = \binom{n}{x} p^x (1-p)^{n-x}
======== ==========================================
Support :math:`x \in \{0, 1, \ldots, n\}`
Mean :math:`n p`
Variance :math:`n p (1 - p)`
======== ==========================================
Parameters
----------
n : int
Number of Bernoulli trials (n >= 0).
p : float
Probability of success in each trial (0 < p < 1).
"""
def __init__(self, n, p, *args, **kwargs):
super(Binomial, self).__init__(*args, **kwargs)
self.n = n
self.p = p
self.mode = T.cast(T.round(n * p), self.dtype)
def random(self, point=None, size=None, repeat=None):
n, p = draw_values([self.n, self.p], point=point)
return generate_samples(stats.binom.rvs, n=n, p=p,
dist_shape=self.shape,
size=size)
def logp(self, value):
n = self.n
p = self.p
return bound(
binomln(n, value) + logpow(p, value) + logpow(1 - p, n - value),
0 <= value, value <= n,
0 <= p, p <= 1)
关于从哪里开始的任何建议?