PyMC中的随机变量logp
我对logp有些困惑,想通过一个网页上的例子来解释,这样我能更清楚地说明我的问题。
我写了一个叫做disaster_model.py的文件,具体内容可以参考这个教程:http://pymc-devs.github.io/pymc/tutorial.html
我打开了一个python命令行,导入了所有需要的模块,然后做了以下操作:
In [2]: import disaster_model
Out[2]: -2.9780301980174
In [3]: disaster_model.switchpoint.logp
Out[3]: -4.709530201312334
In [4]: disaster_model.late_mean.logp
Out[4]: -2.407183392124894
In [5]: disaster_model.early_mean.logp
Out[5]: -2.9780301980174
M = MCMC(disaster_model)
M.sample(iter = 10000, burn = 1000, thin = 10)
In [11]: M.switchpoint.logp
Out[11]: -4.709530201312334
In [12]: M.early_mean.logp
Out[12]: -3.2263189370368117
In [13]: M.late_mean.logp
Out[13]: -0.9012784557735074
In [14]: M.disasters.logp
Out[14]: -164.37141285002255
我想再次强调一下在disaster_model.py中写的这一行:
disasters = Poisson('disasters', mu=rate, value=disasters_array, observed=True)
所以,disasters的值是不会改变的。
现在我有两个问题:
1) 为什么除了switchpoint以外,其他变量的log概率都发生了变化?
(请解释一下为什么log概率应该变化,如果应该变化,那为什么switchpoint的没有变化呢?)
2) 旧的和新的log概率分别代表什么?
(虽然是在ipython命令行下,而不是python,但这并不重要。)
1 个回答
回复得有点晚,不过没关系。来看看你的问题。
1) 为什么除了切换点以外,其他变量的对数概率会变化?
logp
属性表示一个变量在给定其父变量的情况下的对数概率。对于switchpoint
,它的先验分布是从0到110年的均匀分布,而它的父变量是这个均匀分布的上下限。无论switchpoint
取什么值,它的概率都是1/111,所以它的先验对数概率是ln(1/111) = -4.70953,这个值是永远不会改变的。
而其他变量(比如early_mean
和late_mean
)的对数概率会变化,因为在MCMC算法运行时,它们的先验分布是指数分布,而不是均匀分布。
2) 旧的和新的对数概率分别代表什么?
在你的问题中,旧的和新的对数概率表示的是随机变量early_mean
、late_mean
和switchpoint
在它们“当前”值下的先验对数概率。你可以通过计算np.log(scipy.stats.expon.pdf(M.early_mean.value, scale=1))
来验证early_mean
的值,并与M.early_mean.logp
进行比较。注意,指数分布中的scale参数反映了在disaster_model.py
中定义的scale参数。