【问题标题】:PyMC3 generates error during Possion model creationPyMC3 在 Possion 模型创建期间产生错误
【发布时间】:2019-09-23 22:03:29
【问题描述】:

我编写了简单的泊松模型创建代码。但是 PyMC3 会产生一个错误,需要在模型中添加一个额外的变量。

模型看起来不错。但我不确定出了什么问题。

代码:

with pm.Model() as model:

    lambda_1 = pm.Exponential('lambda_1', alpha) # create stochastic    variable
    lambda_2 = pm.Exponential('lambda_2', alpha) #create stochastic variable

    tau = pm.DiscreteUniform("tau", lower=0, upper=size)
    print("Random output:", tau.random(), tau.random(), tau.random())


    def lambda_ (tau=tau, lambda_1 = lambda_1, lambda_2 = lambda_2):
       out = np.zeros(size)
       out[:tau] = lambda_1
       out[tau:] = lambda_2

       return out

   observation = pm.Poisson("obs", lambda_, lambda_value = textfile,    observed=True)

   model = pm.Model(observation, lambda_1, lambda_2, tau)

错误:

文件“”,第 1 行,在
runfile('/home/saul/pythonWork/textmessageAnalysis.py', wdir='/home/saul/pythonWork')

运行文件中的文件“/home/saul/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py”,第 786 行 execfile(文件名,命名空间)

文件“/home/saul/anaconda3/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py”,第 110 行,在 execfile exec(编译(f.read(),文件名,'exec'),命名空间)

文件“/home/saul/pythonWork/textmessageAnalysis.py”,第 51 行,在 观察 = pm.Poisson("obs", lambda_, lambda_value = textfile,observed=True)

中的文件“/home/saul/.local/lib/python3.7/site-packages/pymc3/distributions/distribution.py”,第 31 行 raise TypeError("上下文栈上没有模型,需要这个"

TypeError:上下文堆栈上没有模型,这是实例化分布所必需的。在 'with model:' 块内添加变量,或使用 '.dist' 语法进行独立分发。

【问题讨论】:

  • 您的模型不好,错误太多,无法在答案中简明扼要地解决所有问题。请尝试完成一些 PyMC3 介绍教程(例如,Quick Start Guide),然后将您的模型基于那里的代码作为模板。
  • 感谢您的回复。该模型非常简单,可以在 PyMC 中运行。问题是在 PyMC3 中它会产生上述错误。我会通过教程。但我认为有人遇到了同样的错误,可以帮助我。
  • 可能只是一个复制粘贴错误,但引发错误的行不像其他行那样缩进,这将使它不再在 with 上下文中,这就是错误说。所有声明的pm.RandomVariable 对象都需要附加到pm.Model,这就是with 上下文所提供的。另外,最后你不需要另一个pm.Model()observed 应该是您的观察值,而不是 boolean。还有更多……最好从有用的东西开始,然后使用它。

标签: python bayesian pymc3 poisson


【解决方案1】:

我解决了这个问题。这个问题主要是由于 PyMC3 的性质与 PyMC 非常不同。

更新后的代码如下。

n_data_points = size   
idx = np.arange(n_data_points)
with model:
    lambda_ = pm.math.switch(tau >= idx, lambda_1, lambda_2)            


with model:
    obs = pm.Poisson("obs", lambda_, observed=textfile)
print(obs.tag.test_value)

model = pm.Model([obs, lambda_1, lambda_2, tau])
print(model)

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 2021-04-28
    • 1970-01-01
    • 2019-06-07
    • 2017-04-13
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多