我试图获取有关分层模型的一些信息,并发现了这篇精彩帖子: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
。现在,我对这里的语法感到困惑。我得到了装饰器的定义,但没有带有方括号的a
和b
的定义。有人在该领域有经验,并且会介意分享幕后发生的事情吗?
答案 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
的父项(即,它们将填充父项字典)。
所以hyperpriors
是Stochastic
类的一个实例,它是支持索引的对象。因此,您可以在该对象上使用hyperpriors[0]
和hyperpriors[1]
。 hyperpriors
不再是一个函数。