如何使用Pymc3模拟有偏见的6面骰子?

时间:2017-09-27 18:27:02

标签: python bayesian pymc3

如何使用Pymc3模拟6面骰子卷?另外,我知道骰子的不同侧面有不同的分布吗?

2 个答案:

答案 0 :(得分:6)

PyMC3中模拟1000卷公平6面模具的最简单方法是

import pymc3 as pm

with pm.Model():
    rolls = pm.DiscreteUniform('rolls', lower=1, upper=6)
    trace = pm.sample(1000)
trace['rolls']  # shows you the result of 1000 rolls

请注意,调用np.random.randint(1, 7, size=1000)的速度较慢,但​​相当。

1000卷不公平的模具

probs = np.array([0.1, 0.2, 0.3, 0.2, 0.1, 0.1])

with pm.Model():
    rolls = pm.Multinomial('rolls', n=1000, p=probs, shape=6)
    trace = pm.sample(1)

np.random.multinomial(1000, pval=probs)相比,它更等效,但速度更慢。

你想要使用PyMC3的情况是,如果你观察到50卷不公平的骰子,有一些之前的期望这是一个公平的死亡,并希望评估该期望的后验。这是一个例子:

observations = np.array([20, 6, 6, 6, 6, 6])
with pm.Model():
    probs = pm.Dirichlet('probs', a=np.ones(6))  # flat prior
    rolls = pm.Multinomial('rolls', n=50, p=probs, observed=observations)
    trace = pm.sample(1000)
trace['probs']  # posterior samples of how fair the die are

您可以使用内置的traceplot查看示例的外观:

posterior plot

请注意,我们正确地确定其中一方比其他方更频繁出现!

答案 1 :(得分:0)

您可以使用随机模块生成伪随机数。以下是我的工作示例。

import random

def roll_dice(num_sides=6):
    return random.randint(0,num_sides-1) + 1

if __name__ == '__main__':

    result = roll_dice(num_sides=2)
    print(result)