硬币投掷,随机变量算法和PyMC3

时间:2018-02-16 20:56:03

标签: python random probability montecarlo pymc3

我发现自己想要在Python中执行随机变量的算法;为了举个例子,让我们考虑反复抛掷两个独立的公平硬币并计算头数的实验。

使用scipy.stats对每个随机变量进行独立采样非常简单,我们可以立即开始获取结果

In [5]: scipy.stats.bernoulli(0.5).rvs(10) + scipy.stats.bernoulli(0.5).rvs(10)
Out[5]: array([1, 0, 0, 0, 1, 1, 1, 2, 1, 2])

现在,一个悲观主义者会说我们甚至不必走那么远而只能做np.random.randint(2, size=10) + np.random.randint(2, size=10),而愤世嫉俗的人会注意到我们可以只计算总和而不必采样任何东西。

他们是对的。所以,假设我们有更多的变量和更复杂的操作来执行它们,graphical models很快变得有用。也就是说,我们可能希望对随机变量本身进行操作,并且只在设置计算图时才开始采样。在lea中,确实如此(尽管仅用于离散分布),上面的示例变为

In [1]: from lea import Lea

In [7]: (Lea.bernoulli(0.5) + Lea.bernoulli(0.5)).random(10)
Out[7]: (0, 2, 0, 2, 0, 2, 1, 1, 1, 2)

似乎像魅力一样工作。输入PyMC3,这是一个比较流行的概率编程库。现在,PyMC3特别适用于MCMC和贝叶斯建模,但它具有我们上述实验所需的构建模块。可惜的是,

In [1]: import pymc3 as pm

In [2]: pm.__version__
Out[2]: '3.2'

In [3]: with pm.Model() as model:
   ...:     x = pm.Bernoulli('x', 0.5)
   ...:     y = pm.Bernoulli('y', 0.5)
   ...:     z = pm.Deterministic('z', x+y)
   ...:     trace = pm.sample(10)
   ...:
Assigned BinaryGibbsMetropolis to x
Assigned BinaryGibbsMetropolis to y
100%|███████████████████████████████████████| 510/510 [00:02<00:00, 254.22it/s]

In [4]: trace['z']
Out[4]: array([2, 0, 2, 0, 2, 0, 2, 0, 2, 0], dtype=int64)

Not exactly random。不幸的是,我缺乏对Gibbs采样器产生这种特殊结果的原因的理论上的理解(实际上我应该只是阅读书籍)。使用step=pm.Metropolis()代替我们在一天结束时获得正确的分布,即使单个样本与其邻居强烈相关(正如MCMC预期的那样)。

In [8]: with pm.Model() as model:
   ...:     x = pm.Bernoulli('x', 0.5)
   ...:     y = pm.Bernoulli('y', 0.5)
   ...:     z = pm.Deterministic('z', x+y)
   ...:     trace = pm.sample(10000, step=pm.Metropolis())
   ...:
100%|██████████████████████████████████████████████████████████████████████████████████████████| 10500/10500 [00:02<00:00, 5161.18it/s]

In [14]: collections.Counter(trace['z'])
Out[14]: Counter({0: 2493, 1: 5024, 2: 2483})

所以,也许我可以继续使用pm.Metropolis来模拟我的算术后分布,但是我害怕我错过了什么,所以问题最终变成:为什么step - 上面的模拟失败很少,并且将PyMC3用于普通的非MC,MC是否有任何陷阱,这是我在PyMC3中首先尝试做的事情?

1 个答案:

答案 0 :(得分:0)

colcarroll 的评论:

[二月。 21,2018]:绝对是一个错误-github.com/pymc-devs/pymc3/issues/2866。您正在执行的操作应该可以,但不是库的意图。您将使用PyMC3推理不确定性(也许观察z并推理xy的概率)。我认为您的前两种方法以及石榴库可能会更有效。参见stackoverflow.com/questions/46454814/…–

[二月。 [25,2018]:现在,由Junpeng Lao将其固定在master上(请参见github.com/pymc-devs/pymc3/pull/2867)。参见andrewgelman.com/2018/01/18/…,了解“反相关抽奖”的背景。我不确定stackoverflow如何处理这样的问题。