【发布时间】:2017-09-27 18:27:02
【问题描述】:
如何使用 Pymc3 模拟 6 面掷骰子?另外,我知道骰子的不同面有不同的分布吗?
【问题讨论】:
如何使用 Pymc3 模拟 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 查看示例的外观:
请注意,我们正确地计算出其中一方出现的频率高于其他方!
【讨论】: