【问题标题】:Understanding code with decorators in pymc, Python用 pymc、Python 中的装饰器理解代码
【发布时间】:2015-11-17 06:06:03
【问题描述】:

我试图获取有关分层模型的一些信息,发现这篇很棒的帖子: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 的方括号的定义。是否有人在该领域有经验并愿意分享幕后发生的事情?

【问题讨论】:

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


    【解决方案1】:

    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 函数,前面有一个称为 decorator [vanRossum2010] 的 Python 表达式,这里称为 @stochastic。通常,装饰器通过附加属性或功能来增强功能。由@stochastic 装饰器生成的Stochastic 对象将使用函数switchpoint 评估其对数概率。 value 参数是必需的,它为变量提供初始值。其余参数将被分配为 switchpoint 的父级(它们将填充父级字典)。

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

    【讨论】:

    • 好的,所以随机类具有返回传递到值的更新变量的属性。所以,就我而言:a = hyperpriors[0] 和 b = hyperpriors[1]。在你的情况下,我会有 year = switchpoint[0]。该模型根据指定的分布拟合变量,在我的例子中是超先验。然后将存储在内部(随机类内部)的变量作为实例超先验的索引进行访问,并设置为 a 和 b。我认为现在这更有意义。谢谢!
    猜你喜欢
    • 2017-05-04
    • 2014-07-23
    • 2016-12-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多