Я пытаюсь приспособить модель PyMC3 к некоторым данным, касающимся продаж с течением времени.Вот краткое описание:
- N каждый продавец продает определенное количество виджетов в неделю
- Мы предполагаем, что каждый продавец продает виджеты с разной средней скоростью в неделю, и называем это beta_i для продавцаi
- Предполагается, что наши наблюдаемые данные равны ~ Пуассону (бета_i).
Средненедельные данные о продажах приведены здесь в гистограмме, с логарифмически нормальным соответствием сверху, додать вам представление о распределении еженедельных продаж виджетов по продавцам.
В этом первом сценарии я получаю, как мне кажется, разумный набор бета-версий, хотя они не выглядят особенно логично-нормальными:
Поскольку мы надеемся сделать вывод о базовой тенденции, которую разделяют все продавцы (что-то аналогичное «экономике»), мы попытались что-то добавить.В нашей первой попытке «экономия» представляла собой просто линейную функцию времени, начиная с значения перехвата 1 и производной гаммы> 0 (гамма была полунормальной с sd=0.5
).Затем у нас были данные ~ Пуассона (бета_i * (1 + гамма)).В этом сценарии бета-версии не сильно изменились, и мы сделали вывод об «экономике», хотя это был довольно слабый эффект.
Я надеюсь заменить это случайным блужданием или гауссовским процессом, чтобы позволить "экономике" изменяться несколько плавно во времени, но иметь произвольную форму.В идеале он должен начинаться со значения 0, а затем идти туда, куда нужно, чтобы зафиксировать основную тенденцию, разделяемую всеми продавцами, с данными еще раз ~ Пуассоном (бета_i * (1 + гамма)).Вот наша модель.
with pm.Model() as model:
# Salesperson base rate of selling widgets
beta_ = pm.Lognormal("beta", mu=mu_hat, sd=sd_hat, shape=(1, n_salespeople))
# mu_hat and sd_hat were estimated by fitting a log-normal to weekly sales data
# Economy
gamma_ = pm.GaussianRandomWalk("gamma", mu=0, sd=1e-6, shape=(n_weeks, 1))
# Effects
base_rate = beta_
economy = 1 + gamma_
# Observed
lambda_ = base_rate * economy
y = pm.Poisson("y", mu=lambda_, observed=observed_sales + 1e-7)
, где observed_sales
- целочисленный массив количества совершенных продаж, формы (n_weeks, n_salespeople)
.
Во-первых, я не уверен, что яуказав эту модель правильно.Без «экономики» я делаю разумный набор бета-версий (хотя он не выглядит логарифмически нормальным, как на втором скриншоте).Тогда случайное блуждание, которое мы получаем, не совсем гладкое, независимо от того, насколько маленьким становится SD;чаще всего по причинам, в которых я не уверен, я получаю сообщение «Массовая матрица содержит нули на диагонали».Наконец, даже в начале я получал бесконечные вероятности, если бы я не добавил небольшой фактор к наблюдаемым данным ... Почему это так?
Итак, TL;ДР: Я довольно новичок в вероятностном программировании, и я уверен, что что-то идет не так, но я не уверен, что именно.Любой вклад очень, очень ценится!