从Pymc保存的跟踪数据绘制图形

4
我需要使用不同的参数多次运行MCMC来检查收敛性。因此,我决定保存跟踪记录,以便在需要时(比较目的)知道以下结果:pymc.MCMC(iter=10000, burn=1000, thin=10) 我无需重新运行它。(由于我必须对许多不同的参数值执行相同的操作,这需要很多时间)。我找到了一个解决方案。
m = MCMC([tau, rv], db='pickle', dbname='10000iter1000burn.pickle')
m.sample(iter = 10000, burn = 5000, thin = 10)
m.db.close()

现在,跟踪数据已保存在名为10000iter1000burn.pickle的数据库中。

现在,要加载跟踪数据,我执行以下操作:

db = pymc.database.pickle.load('10000iter5000burn.pickle')

当我执行 print db.trace('tau')[:] 时,我会得到相同的输出,但是当我想要绘制图形或获取其他信息时,它会失败。

plot(db)  #error

plot()至少需要2个参数(只给出了1个),但是当我执行plot(m)(初始情况下再次运行采样器时)时,它可以正常工作。

同样db.tau.summary()会出现错误'Trace' object has no attribute 'summary'。当我执行m.tau.summary()时,它可以正常工作。

db.logp也是如此。

我是这个领域的新手。如果语法中有任何错误,请指正。 如果有其他方法可以重新绘制图形并获取模型的对数概率而不必再次运行mcmc,则请告诉我。


我猜你从某个库中导入了 *,该库覆盖了 matplotlib 的 plot 函数。尝试导入 import matplotlib.pyplot as plt 并调用 plt.plot(db) - mwaskom
是的,你是对的,但我仍然收到错误消息 TypeError: float() argument must be a string or a number - turing
1个回答

4

您不能直接将数据库后端传递给绘图函数。您可以传递以下四种参数之一:(1)原始节点/随机变量 (2)跟踪对象 (3)pymc节点/随机变量的字典或(4)原始输出。


啊,我以为你正在使用 pymc.Matplot.plot 函数。你需要访问已加载数据库中的 traces,并通过任何你想要的方式绘制它们。 - Chris Fonnesbeck
你能否举个例子,说明我不需要再次取样。 - turing
谢谢您回复有关使用绘图函数的内容,我还想使用logp而不必重新采样,以便进行后验概率的对比。 - turing
1
很抱歉,您不能这样做。后端只保存采样值,而不是其相关的对数概率值。唯一的方法是在模型中创建一个确定性节点,返回对数概率值;然后它将作为跟踪中的一个值进行保存。 - Chris Fonnesbeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接