PyMC3 traceplot不显示

时间:2017-11-20 09:00:20

标签: python matplotlib pymc3

我试图从Osvaldo Martin的贝叶斯分析与Python 工作中获取PyMC3示例。在Windows 10上,使用matplotlib的以下代码工作正常(即显示图表):

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats


def posterior_grid(grid_points=100, heads=6, tosses=9):
    """
    A grid implementation for the coin-flip problem
    """
    grid = np.linspace(0, 1, grid_points)
    prior = 0.5 - abs(grid - 0.5)
    likelihood = stats.binom.pmf(heads, tosses, grid)
    unstd_posterior = likelihood * prior
    posterior = unstd_posterior / unstd_posterior.sum()
    return grid, posterior


if __name__ == "__main__":
    points = 100
    h, n = 1, 4
    grid, posterior = posterior_grid(points, h, n)
    plt.plot(grid, posterior, 'o-', label='heads = {}\ntosses = {}'.format(h, n))
    plt.xlabel(r'$\theta$')
    plt.legend(loc=0)
    plt.show()

...我无法得到以下内容 - 它使用PyMC3的traceplot - 来显示图表:

import pymc3 as pm
import numpy as np
import scipy.stats as stats

if __name__ == "__main__":

    np.random.seed(123)
    n_experiments = 4
    theta_real = 0.35
    data = stats.bernoulli.rvs(p=theta_real, size=n_experiments)
    print(data)

    with pm.Model() as our_first_model:
        theta = pm.Beta('theta', alpha=1, beta=1)
        y = pm.Bernoulli('y', p=theta, observed=data)
        start = pm.find_MAP()
        step = pm.Metropolis()
        trace = pm.sample(1000, step=step, start=start)

    burnin = 100
    chain = trace[burnin:]
    pm.traceplot(chain, lines={'theta':theta_real});

代码运行并退出正常,但不显示任何图表。

我在IntelliJ IDEA中使用Python插件,从我的根环境的Anaconda控制台窗口和IPython中尝试过。

在IPython中,我在控制台上获得以下输出:

Out[3]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000024BDD622F60>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000024BDD667208>]], dtype=object)

......显然正在发生一些事情。但是如何将结果显示为图表?

我也尝试过用Python 3.5编写的精确库版本,但仍然没有traceplot图表:

  • Ipython 5.0
  • NumPy 1.11.1
  • SciPy 0.18.1
  • Pandas 0.18.1
  • Matplotlib 1.5.3
  • Seaborn 0.7.1
  • PyMC3 3.0

1 个答案:

答案 0 :(得分:6)

各种Googling让我得到以下答案。

使用IPython,您必须使用ipython --pylab auto进行调用,以便为matplotlib提供合适的后端(至少在Windows上)。

使用IntelliJ IDEA / PyCharm,您需要添加

import matplotlib.pyplot as plt

然后

plt.show()

traceplot行之后显示情节。