非常简单的问题:我应该如何使用@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,以获得更好的可能性。
发布于 2014-11-06 06:53:33
@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]来表示观察到的数据。
我已经把这些放在一本笔记本,显示了这里的一切。里了。
发布于 2018-03-24 18:56:20
是的,混淆很容易,因为@随机返回一个可能性,这与错误本质上是相反的。因此,您使用自定义错误函数的负日志,并将其作为日志可能性返回。
https://stackoverflow.com/questions/26703950
复制相似问题