在pymc中从保存的轨迹绘制图形

4 投票
1 回答
1431 浏览
提问于 2025-04-18 07:53

我需要多次运行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'对象没有'summary'属性,而当我用m.tau.summary()时就能正常工作。

对于db.logp也是一样。

我在这个领域还是个新手。如果我的语法哪里有错误,请指正。如果有其他方法可以在不重新运行MCMC的情况下重新绘制图形并获取模型的对数概率,我会很高兴知道。

1 个回答

4

你不能直接把数据库后端传给绘图函数。你可以选择以下几种方式: (1) 传递原始的节点或随机变量 (2) 传递一个跟踪对象 (3) 传递一个包含pymc节点或随机变量的字典,或者 (4) 传递原始的输出结果。

撰写回答