Гамма-распределения в Pymc — байесовское тестирование

#python #bayesian #ab-testing #pymc #gamma-distribution

#python #байесовский #ab-тестирование #pymc #гамма-распределение

Вопрос:

Я внимательно следил за этой книгой (http://nbviewer.ipython.org/github/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/blob/master/Chapter2_MorePyMC/MorePyMC.ipynb ) но я столкнулся с проблемами при попытке использовать Pymc для моей собственной проблемы.

У меня есть куча значений заказов от клиентов, которые разместили заказ, и они выглядят разумно как гамма-распределение. Я запускаю тест 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.
  

Поэтому вместо того, чтобы идти прямо к гамма-распределению, мы ищем параметры (я думаю). Похоже, это помогает в том смысле, что оно дает мне значения в следах правильного порядка величины. Однако теперь я могу построить гистограмму выборок для альфа-версии как для тестовых групп, так и для бета-версии, но это не совсем то, что мне нужно. Я хочу иметь возможность отображать каждое из «гамма-подобных» распределений тестовой группы, рассчитанных на основе предыдущего и значений, которые я предоставляю. Я также хочу иметь возможность построить «дельту», как показывает пример тестирования AB. Я чувствую, что детерминированная переменная во втором примере будет моим лучшим выбором, но я действительно не знаю, как лучше всего это построить.

Короче говоря, у меня есть данные, полученные из гамма-дистрибутива, которые я хотел бы протестировать. У меня есть предварительный просмотр данных в гамме, хотя можно было бы убедить, что у меня есть обычный предварительный просмотр, если это проще. Я хотел бы разумным образом обновить идентичные априорные данные собранными мной данными и построить графики распределений и разницы между ними.

Приветствия,

Мэтт

Комментарии:

1. Итак, вы хотите сгенерировать несколько выборок, которые соответствуют вашему распределению данных?

2. У меня есть предварительное предположение о распределении моих данных, у меня есть образцы данных, взятые из каждого дистрибутива, и я хотел бы обновить свои предыдущие предположения на основе собранных мной точек данных. Я сгенерировал несколько «примеров точек данных» в своем коде (observations_A и observations_B) для целей тестирования, но они будут фактическими точками данных — я хотел бы использовать их для изменения моих предыдущих предположений (гамма-распределение) для сравнения каждой тестовой группы.