我正在尝试模拟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个单位,我预计会得到相同的结果。知道为什么他们不一样吗?我做错了什么?
这是完整的代码:
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
答案 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中对其进行了纠正。将来,请检查您拥有的版本及其行为方式。