我该如何使用@随机项目经理在PyMC?

2024-05-16 05:16:07 发布

您现在位置:Python中文网/ 问答频道 /正文

相当简单的问题:我应该如何使用@pm.stochastic?我读过一些博客文章,声称@pm.stochastic期望日志值为负值:

@pm.stochastic(observed=True)
def loglike(value=data):
  # some calculations that generate a numeric result
  return -np.log(result)

我最近试过这个,但发现效果很差。因为我也注意到有些人np.日志而不是-np.日志,我试了一下,效果好多了。真正期望@pm.stochastic是什么?我猜是因为一个非常流行的例子使用了类似np.log(1/(1+t_1-t_0))的东西,它被写成-np.log(1+t_1-t_0),所以在所需的符号上有一点混乱

另一个问题:这个修饰符用value参数做什么?据我所知,我们从需要输入似然值的先验值开始,@pm.stochastic的思想基本上是产生一些数字,将这种可能性与采样过程中前一次迭代生成的数字进行比较。似然函数应该接收value参数和一些prior值,但我不确定{}是否就是这样做的,因为这是唯一需要的参数,但我可以写:

^{pr2}$

据我所知,结果和以前一样。也许,它是这样工作的,因为我在decorator中添加了observed=True。如果我在默认情况下使用observed=False在随机变量中尝试此操作,value将在每次迭代中更改,以获得更好的可能性。在


Tags: logtrue参数valuenp文章数字result
2条回答

是的,混淆是很容易的,因为@randocial返回了一个与错误本质相反的可能性。因此,您将自定义错误函数的负日志作为日志可能性返回。在

@pm.stochastic是一个修饰符,因此它需要一个函数。使用它的最简单的方法是给它一个包含value作为其参数之一的函数,并返回一个日志似然值。在

您应该使用@pm.stochastic修饰符为模型中的参数定义一个自定义的prior。您应该使用@pm.observed修饰符来定义数据的自定义可能性。这两个decorator都将创建一个pm.Stochastic对象,该对象的名称来自它所装饰的函数,并具有所有熟悉的方法和属性(这里是a nice article on Python decorators)。在

示例:

一个参数a,其先验分布为三角形:

@pm.stochastic
def a(value=.5):
    if 0 <= value < 1:
        return np.log(1.-value)
    else:
        return -np.inf

这里使用value=.5作为参数的初始值,将其更改为value=1会引发一个异常,因为它超出了发行版的支持范围。在

一个似然b是以a为中心的正态分布,具有固定的精度:

^{pr2}$

这里value=[.2,.3]用于表示观测数据。在

我把这个放在a notebook that shows it all in action here里。在

相关问题 更多 >