PyMC多时间序列观测(来自《黑客的贝叶斯方法》中短信示例的改编)

2024-09-25 12:30:40 发布

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

我正在尝试修改Cameron Davidson Pilon的Bayesian Methods for Hackers, Chapter 1, "Introducing our first hammer: PyMC"文本消息示例来处理多个观察结果。下面的解决方案似乎是有效的,但我是pymc新手,我不确定这是否是处理pymc中多个时间序列观察的好方法。任何建议都将不胜感激!在

为了给黑客重新定义贝叶斯方法中的短信示例,观察结果包括74天的短信计数,如下图所示。在

enter image description here

这本书使用一个开关点参数(tau)和两个指数参数(lambda1和lambda2)对这个过程进行建模,这两个参数分别控制tau前后的泊松分布消息计数。对于本例,pymc使用以下代码生成大约为:tau=45、lambda1=18和lambda2=23的解,这与本书的代码几乎相同:

import numpy as np
import pymc

observation = np.loadtxt( './txtdata.csv' ) #data available at the book's GitHub site
n_days      = observation.size    #number of days
alpha       = 1./20  #assume a mean of 20 messages per day
lambda1     = pymc.Exponential("lambda1", alpha)
lambda2     = pymc.Exponential("lambda2", alpha)
tau         = pymc.DiscreteUniform("tau", lower=0, upper=n_days)

@pymc.deterministic
def lambda_(tau=tau, lambda1=lambda1, lambda2=lambda2):
    a       = np.zeros(n_days)
    a[:tau] = lambda1
    a[tau:] = lambda2
    return a
observation_model  = pymc.Poisson("observation", lambda_, value=observation, observed=True)

model   = pymc.Model([observation_model, tau, lambda1, lambda2])
mcmc    = pymc.MCMC(model)
mcmc.sample(40000, 10000)

print()
print( mcmc.trace('tau')[:].mean() )
print( mcmc.trace('lambda1')[:].mean() )
print( mcmc.trace('lambda2')[:].mean() )

我的问题是:应该如何调整它来处理多个观察结果?在

我的解决方案如下所示,并且似乎有效,但是我想知道是否有更好的方法在pymc中建模问题。在

首先,我使用tau=45、lambda1=18和lambda2=23生成五个随机观察值,如下所示:

^{pr2}$

运行上面的代码会生成一个(5x74)“观测值”数组,代表五个不同的人的数据,例如,超过74天,如下所示。在

enter image description here

下一步是我不确定的部分:在pymc中,这五个观测值应该如何建模?以下是我所拥有的:

@pymc.deterministic
def lambda_multiple(tau=tau, lambda1=lambda1, lambda2=lambda2):
    a = np.zeros( (n_observations, n_days) )
    a[:, :tau] = lambda1
    a[:, tau:] = lambda2
    return a

observation_model  = pymc.Poisson("observations", lambda_multiple, value=observations, observed=True)

运行这个模型似乎会产生tau、lambda1和lambda2的预期结果,但我想知道这是否是处理多个观测值的适当方法?在


Tags: 方法lambda参数modelnpmean建模days