PyMC3 моделирование данных клиентов
Я столкнулся со следующей ситуацией. Два типа клиентов приходят на сайт, чтобы купить продукты. Продукты ранжируются в списке. Предполагается, что есть два типа клиентов, постоянные и случайные. Оба типа будут покупать продукты, перечисленные на сайте. Продукты с более низким рейтингом реже покупаются обоими типами клиентов. Тем не менее, лояльные покупатели с большей вероятностью приобретут товар данного ранга, чем случайный покупатель. Чтобы смоделировать это, я делаю следующие предположения
- Процент пользователей лояльных (но пока неизвестно)
- Лояльные покупатели (и случайные покупатели) с большей вероятностью будут покупать товары более высокого ранга, но лояльные покупатели с большей вероятностью. Вероятность покупки как функция ранга моделируется как y_i = alpha_0 + alpha_1*(1/Rank).
У нас есть только наблюдаемые оценки и сигнал "да / нет" о том, покупал ли клиент продукт. Как можно использовать вероятностное программирование с PyMC3, чтобы вернуться к параметрам модели? Вот что я так далеко.
Функция для симуляции клиентов для создания фиктивных данных.
def draw_customers(p1, p2, p3, p4, beta, n):
x = []
y = []
for i in range(n):
rank = np.random.randint(1, 5, 1)[0]
x.append(rank)
if np.random.rand() < beta:
if p1 + p2/rank < 0.06:
y.append(1)
else:
y.append(0)
else:
if p3 + p4/rank < 0.06:
y.append(1)
else:
y.append(0)
return x, y
Фактическая модель выглядит следующим образом
with pm.Model():
b = Uniform('b', 0, 1)
p = Normal('p', mu=0, sd=1, shape=4)
def logp(x):
return (b*(p[0] + p[1]/x_obs) + (1 - b)*(p[2] + p[3]/x_obs)).sum()
click_prob = pm.DensityDist('click_prob', logp, observed = y_obs)
step = pm.Metropolis()
trace = pm.sample(10000, step=step, progressbar=True)
pm.summary(trace, vars=['p', 'b'])
Однако, когда я запускаю эту модель, я получаю следующие результаты. п:
Средняя ошибка SD MC 95% интервал HPD
189.000 36.928 3.685 [91.969, 203.460] 491.203 101.231 10.112 [212.274, 525.501] 2.058 7.882 0.771 [-4.004, 14.968] -0.576 2.876 0.248 [-9.079, 3.181]
Задние квантили: 2,5 25 50 75 97,5 | -------------- | ============== | =========== === | -------------- |
38.316 199.001 199.872 200.587 201.975 93.135 520.955 521.808 522.551 524.000 -1.944 -0.591 0.162 0.960 36.604 -10.925 -0.876 -0.104 0,717 2,188
б:
Средняя ошибка SD MC 95% интервал HPD
1.0000,016 0,000 [1.000, 1.000]
Задние квантили: 2,5 25 50 75 97,5 | -------------- | ============== | =========== === | -------------- |
1.000 1.000 1.000 1.000 1.000
который, кажется, показывает, что параметры моделируемой модели не восстанавливаются. Может кто-то указать, что я делаю не так? Похоже, это довольно простой пример. заранее спасибо