首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在@pm.stochastic中使用PyMC?

如何在@pm.stochastic中使用PyMC?
EN

Stack Overflow用户
提问于 2014-11-02 20:22:00
回答 2查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
@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所做的,因为这是唯一需要的参数,但我可以编写:

代码语言:javascript
复制
@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,以获得更好的可能性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 06:53:33

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

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

示例:

具有三角形分布的参数a

代码语言:javascript
复制
@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为中心,具有固定的精度:

代码语言:javascript
复制
@pm.observed
def b(value=[.2,.3], mu=a):
    return pm.normal_like(value, mu, 100.)

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

我已经把这些放在一本笔记本,显示了这里的一切。里了。

票数 3
EN

Stack Overflow用户

发布于 2018-03-24 18:56:20

是的,混淆很容易,因为@随机返回一个可能性,这与错误本质上是相反的。因此,您使用自定义错误函数的负日志,并将其作为日志可能性返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26703950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档