PyMC: a few time-series observations (adaptation of a sample text message from Bayesian methods for hackers)

I am trying to adapt a sample text message from Cameron Davidson-Pilon Bayesian methods for hackers, chapter 1, “Introducing our first hammer: PyMC” to handle several observations. The solution below seems to work, but I'm new to pymc, and I'm not sure if this is a good way to handle multiple time series observations in pymc. Any advice would be greatly appreciated!

To re-close the sample text message from Bayesian methods for hackers, the observations consist of 74 days of counting text messages, as shown in the figure below.

enter image description here

switchpoint (tau) (lambda1 lambda2), , Poisson, tau . pymc : tau = 45, lambda1 = 18 lambda2 = 23, , :

import numpy as np
import pymc

observation = np.loadtxt( './txtdata.csv' ) #data available at the book 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 :

n_observations = 5
n_days  = 74
alpha   = 1./20
lambda1 = pymc.Exponential("lambda1", alpha)
lambda2 = pymc.Exponential("lambda2", alpha)
tau     = pymc.DiscreteUniform("tau", lower=0, upper=n_days)

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

observation_generator  = pymc.Poisson("observation_generator", lambda_single)
tau.set_value(45)
lambda1.set_value(18)
lambda2.set_value(23)
n_observations = 5
observations = np.array(  [observation_generator.random() for i in range(n_observations)]  )

5 x 74), , , 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, , ?

+4

Source: https://habr.com/ru/post/1661549/


All Articles