1

相当简单的问题:我应该如何使用@pm.stochastic?我已经阅读了一些声称@pm.stochastic期望负对数值的博客文章:

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

我最近尝试了这个,但发现结果非常糟糕。因为我还注意到有些人使用 np.log 而不是 -np.log,所以我试了一下,效果更好。真正期待的是什么@pm.stochastic?我猜由于一个非常流行的例子使用了类似np.log(1/(1+t_1-t_0))这样的东西,因此所需的标志有点混乱-np.log(1+t_1-t_0)

另一个问题:这个装饰器对value参数做了什么?据我了解,我们从需要输入可能性的先验的一些建议值开始,其想法@pm.stochastic基本上是产生一些数字,以将此可能性与采样过程中先前迭代生成的数字进行比较。可能性应该收到value先验的参数和一些值,但我不确定这是否全部value都在做,因为这是唯一需要的参数,但我可以写:

@pm.stochastic(observed=True)
def loglike(value=[1]):
  data = [3,5,1] # some data
  # some calculations that generate a numeric result
  return np.log(result)

据我所知,这会产生与以前相同的结果。也许,它是这样工作的,因为我添加observed=True了装饰器。如果我在observed=False默认情况下在随机变量中尝试此操作,value则在每次迭代中都会更改以尝试获得更好的可能性。

4

2 回答 2

3

@pm.stochastic是一个装饰器,所以它需要一个函数。使用它的最简单方法是给它一个包含value作为其参数之一的函数,并返回一个对数似然。

您应该使用@pm.stochastic装饰器为模型中的参数定义自定义先验。您应该使用@pm.observed装饰器来定义数据的自定义可能性。这两个装饰器都将创建一个pm.Stochastic对象,该对象的名称来自它所装饰的函数,并具有所有熟悉的方法和属性(这里有一篇关于 Python 装饰器的好文章)。

例子:

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,具有固定的精度:

@pm.observed
def b(value=[.2,.3], mu=a):
    return pm.normal_like(value, mu, 100.)

这里value=[.2,.3]用来表示观察到的数据。

我已经把它放在一个笔记本中,在这里展示了它的全部作用

于 2014-11-06T06:53:33.950 回答
0

是的,混淆很容易,因为@stochastic 返回的可能性本质上与错误相反。因此,您将自定义错误函数的负对数作为对数似然返回。

于 2018-03-24T18:56:20.697 回答