0

我密切关注这本书(http://nbviewer.ipython.org/github/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/blob/master/Chapter2_MorePyMC/MorePyMC.ipynb),但发现自己尝试使用 Pymc 解决我自己的问题时遇到问题。

我从下订单的客户那里得到了一堆订单值,它们看起来很像 Gamma 分布。我正在运行 AB 测试,想看看订单值的分布如何变化 - 输入 Pymc。我按照书中的示例进行操作,但发现它并没有真正为我工作 - 第一次尝试是这样的:

import pymc as pm
import numpy as np
from matplotlib import pyplot as plt
from pylab import savefig

## Replace these with the actual order values in the test set
## Have made slightly different to be able to see differing distributions
observations_A = pm.rgamma(3.5, 0.013, size=1000)
observations_B = pm.rgamma(3.45, 0.016, size=2000)

## Identical prior assumptions
prior_a = pm.Gamma('prior_a', 3.5, 0.015)
prior_b = pm.Gamma('prior_b', 3.5, 0.015)

## The difference in the test groups is the most important bit
@pm.deterministic
def delta(p_A = prior_a, p_B = prior_b):
    return p_A - p_B

## Add observations
observation_a = pm.Gamma('observation_a', prior_a, value=observations_A, observed=True)
observation_b = pm.Gamma('observation_b', prior_b, value=observations_A, observed=True)

mcmc = pm.MCMC([prior_a, prior_b, delta, observation_a, observation_b])
mcmc.sample(20000,1000)

查看prior_a 和prior_b 的轨迹平均值,我看到大约3.97/3.98 的值,当我查看这些先验的统计数据时,我看到了类似的故事。但是,在定义先验后,在先验上调用rand()方法会给我我期望的值(100 到 400 之间)。基本上,更新阶段之一(我对观察阶段最不确定)正在做一些我没想到的事情。

经过一段时间的努力,我找到了这个页面(http://matpalm.com/blog/2012/12/27/dead_simple_pymc/)并决定采用不同的方法:

import pymc as pm
import numpy as np
from matplotlib import pyplot as plt
from pylab import savefig

## Replace these with the actual order values in the test set
observations_A = pm.rgamma(3.5, 0.013, size=1000)
observations_B = pm.rgamma(3.45, 0.016, size=2000)

## Initial assumptions
A_Rate = pm.Uniform('A_Rate', 2, 4)
B_Rate = pm.Uniform('B_Rate', 2, 4)
A_Shape = pm.Uniform('A_Shape', 0.005, 0.05)
B_Shape = pm.Uniform('B_Shape', 0.005, 0.05)

p_A = pm.Gamma('p_A', A_Rate, A_Shape, value=observations_A, observed=True)
p_B = pm.Gamma('p_B', A_Rate, B_Shape, value=observations_B, observed=True)

## Sample
mcmc = pm.MCMC([p_A, p_B, A_Rate, B_Rate, A_Shape, B_Shape])
mcmc.sample(20000, 1000)

## Plot the A_Rate, B_Rate, A_Shape, B_Shape
## Using those, determine the Gamma distribution
## Plot both - and draw 1000000... samples from each.
## Perform statistical tests on these.

因此,我们不是直接寻找 Gamma 分布,而是寻找参数(我认为)。这似乎是一种享受,因为它给了我正确数量级的痕迹值。但是,现在我可以为测试组和 beta 绘制 alpha 样本的直方图,但这并不是我真正想要的。我希望能够绘制从先验和我提供的值计算的每个测试组的“类伽马”分布。正如 AB 测试示例所示,我还希望能够绘制一个“增量”。我觉得第二个示例中的确定性变量将是我最好的选择,但我真的不知道构建它的最佳方法。

长话短说 - 我从 Gamma 分布中提取数据,我想进行 AB 测试。我对数据有一个伽玛先验视图,但如果这更容易的话,我可以相信我有一个正常的先验视图。我想以一种明智的方式用我收集的数据更新相同的先验,并绘制分布和它们之间的差异。

干杯,

马特

4

0 回答 0