移位间隔时,pymc中的DiscreteUniform会出现意外行为

时间:2015-11-27 13:12:07

标签: python bayesian pymc

我正在尝试模拟100次掷骰子,其中数据是所有投掷的总和(Jaynes'Brandeis骰子的最大熵原则的种类)。这是我第一次尝试后来接近骰子。

我正在使用pymc 2.3

如果我用DiscreteUniform('dice', 1, 6, size=N)将骰子值设置为1到6,并将总和值设置为等于平均和值100 * 3.5 = 350,那么我会得到均匀的后验分布,如预期的那样。

但是如果我将骰子值设置为0到5并且总和等于100 * 2.5 = 250,则分布不均匀。 0值的采样少得多!由于我只是将值移动1个单位,我预计会得到相同的结果。知道为什么他们不一样吗?我做错了什么?

enter image description here

这是完整的代码:

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

N = 100
shifts = (0, -1)
for shift in shifts:
    obs_mean = 3.5+shift
    obs_total = int(N*obs_mean)
    sigma = 0.01*N
    dice = pm.DiscreteUniform('dice', 1+shift, 6+shift, size=N)

    @pm.deterministic
    def calc_total(d=dice):
        return np.sum(d)

    total = pm.Normal('total', mu=calc_total, tau=1./sigma, observed=True, value=obs_total)

    # package the full model in a dictionary
    model1 = dict(dice=dice, calc_total=calc_total, total=total)

    # run the basic MCMC:
    S = pm.MCMC(model1)
    S.sample(iter=100000, burn=10000)

    dice_trace = S.trace('dice')[:]-shift
    plt.hist(dice_trace.flat, bins=(0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5), normed=True, alpha=0.5)

plt.show()

编辑:根据评论,我做了一个更简单的模型:两个统一的分布,一个从1到6创建,另一个从0到5,然后是确定性函数{{1为它添加1,以便先前的dice2在两个模型中是相同的,并且可能性仅取决于dice2,但是它们的后验分布是不同的。

另一个有趣的案例是当shift设置为-7时,这会导致只是反转骰子的符号,但会产生不同的后验。

dice2

2 个答案:

答案 0 :(得分:1)

不清楚为什么你一定期望统一分配。离散的制服只是你的先前。所有模型的信息都是shift=0的350和shift=-1的250的总和,并将生成具有此期望的参数估计。当我在每个移位值下运行模型并查看跟踪时,我得到shift=0的以下分布(仅通过唯一值查看摘要):

>>> pd.Series(shift_0.flat).value_counts()

2    1526136
4    1526011
3    1511494
5    1503698
6    1471922
1    1460739

对应于期望:

>>> pd.Series(shift_0.flat).mean() * 100

350.02311111111112

适用于shift=-1

>>> pd.Series(shift_1.flat).value_counts()

1    1894489
2    1724072
3    1577420
4    1457896
5    1320425
0    1025698
dtype: int64


>>> pd.Series(shift_1.flat).mean() * 100

250.08703333333332

所以,模型似乎表现得像我期望的那样。

答案 1 :(得分:1)

这是PyMC版本2.3.6中的采样步骤的问题。它在版本2.3.2中按预期工作。我在github中与Chris Fonnesbeck讨论了这个问题,并在发展版的PyMC中对其进行了纠正。将来,请检查您拥有的版本及其行为方式。