创造一个转移的&在pymc3中缩放Beta

时间:2018-02-18 23:59:07

标签: python scipy pymc3

我尝试创建一个与scipy中的行为类似的测试版RV。即,它需要alphabetalocscale。我跟着关于创建shifted gamma的讨论,并提出了类似这样的内容:

import pymc3 as pm

class SSBeta(pm.Beta):
    def __init__(self, alpha, beta, loc, scale, *args, **kwargs):

        # Not sure what this is doing but it won't work without it. 
        transform = pm.distributions.transforms.lowerbound(loc)

        super().__init__(alpha=alpha, beta=beta, *args, **kwargs, transform=transform)

        self.scale = scale
        self.loc = loc
        self.mean += loc

    def random(self):
        return super().random()*self.scale + self.loc

    def logp(self, x):
        return super().logp((x - self.loc)/self.scale)

所以我有两个问题:

  • 此实施是否正确(randomlogp)?
  • 班级顶层变换的目的是什么?我无法在文档中找到任何有用的内容,代码也无济于事。

1 个答案:

答案 0 :(得分:1)

另一种方法是使用pm.Deterministic。这不允许您传递观察到的数据,但可能是您想要的吗?

mu, scale = 2, 4
with pm.Model():
    b = pm.Beta('b', alpha=3, beta=8)
    shifted_b = pm.Deterministic('shifted_b', scale * b + mu)

enter image description here