在pymc,Python中使用装饰器理解代码

时间:2015-08-23 21:31:58

标签: python python-2.7 decorator python-decorators pymc

我试图获取有关分层模型的一些信息,并发现了这篇精彩帖子:https://sl8r000.github.io/ab_testing_statistics/use_a_hierarchical_model/

在其中,关闭帖子的中间,作者分享了一些代码。有一部分我遇到了麻烦:

@pymc.stochastic(dtype=np.float64)
def hyperpriors(value=[1.0, 1.0]):
  a, b = value[0], value[1]
  if a <= 0 or b <= 0:
    return -np.inf
  else:
    return np.log(np.power((a + b), -2.5))

a = hyperpriors[0]
b = hyperpriors[1]

如您所见,作者使用pymc。现在,我对这里的语法感到困惑。我得到了装饰器的定义,但没有带有方括号的ab的定义。有人在该领域有经验,并且会介意分享幕后发生的事情吗?

1 个答案:

答案 0 :(得分:0)

pymc项目使用装饰器不返回新函数,而是返回Stochastic() class instance

来自文档:

  

disaster_model )中的均匀分布的离散随机变量switchpoint也可以从计算其对数概率的函数中创建,如下所示:

@pymc.stochastic(dtype=int)
def switchpoint(value=1900, t_l=1851, t_h=1962):
    """The switchpoint for the rate of disaster occurrence."""
    if value > t_h or value < t_l:
        # Invalid values
        return -np.inf
    else:
        # Uniform log-likelihood
        return -np.log(t_h - t_l + 1)
     

请注意,这是一个简单的Python函数,前面是一个名为装饰器 [vanRossum2010]的Python表达式,此处称为@stochastic。通常,装饰器通过附加属性或功能增强功能。 Stochastic装饰器生成的@stochastic对象将使用函数switchpoint评估其对数概率。值参数(必需)提供变量的初始值。其余的参数将被指定为switchpoint的父项(,它们将填充父项字典)。

所以hyperpriorsStochastic类的一个实例,它是支持索引的对象。因此,您可以在该对象上使用hyperpriors[0]hyperpriors[1]hyperpriors 不再是一个函数。