Сохранение данных из трассировки в PyMC3

Ниже приведен код простой байесовской линейной регрессии. После того, как я получу трассировку и графики для параметров, есть ли способ сохранить данные, которые создали графики в файле, чтобы, если мне нужно снова построить их, я мог просто построить их из данных в файле вместо того, чтобы снова запускать всю симуляцию?

import pymc3 as pm
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,9,5)
y = 2*x + 5
yerr=np.random.rand(len(x))

def soln(x, p1, p2):
    return p1+p2*x

with pm.Model() as model:
    # Define priors
    intercept = pm.Normal('Intercept', 15, sd=5)
    slope = pm.Normal('Slope', 20, sd=5)
    # Model solution
    sol = soln(x, intercept, slope)
    # Define likelihood
    likelihood = pm.Normal('Y', mu=sol,
                        sd=yerr, observed=y)

    # Sampling

    trace = pm.sample(1000, nchains = 1)


pm.traceplot(trace)
print pm.summary(trace, ['Slope'])
print pm.summary(trace, ['Intercept'])
plt.show()

person Arjun Devdas    schedule 13.06.2018    source источник


Ответы (1)


Есть два простых способа сделать это:

  1. Используйте версию после 3.4.1 (в настоящее время это означает установку с мастера с pip install git+https://github.com/pymc-devs/pymc3). Появилась новая функция, позволяющая эффективно сохранять и загружать трассировки. Обратите внимание, что вам нужен доступ к модели, создавшей трассировку:

    ...
    pm.save_trace(trace, 'linreg.trace') 
    
    # later
    with model:
       trace = pm.load_trace('linreg.trace') 
    
  2. Используйте cPickle (или pickle в python 3). Обратите внимание, что pickle по крайней мере немного небезопасен, не извлекайте данные из ненадежных источников:

    import cPickle as pickle  # just `import pickle` on python 3
    
    ...
    with open('trace.pkl', 'wb') as buff:
        pickle.dump(trace, buff)
    
    #later
    with open('trace.pkl', 'rb') as buff:
        trace = pickle.load(buff)
    
person colcarroll    schedule 13.06.2018