我正在尝试将PyMC3模型与一些有关销售的数据进行拟合。这是一个简短说明:
此处每周平均销售数据以直方图的形式绘制,顶部为对数正态拟合,以使您了解销售员每周小部件销售的分布情况。
在第一种情况下,我得到了一些我认为是合理的beta版本,尽管它们看上去并不是特别的对数正态:
由于我们希望推断出所有销售人员共有的潜在趋势(类似于“经济”),因此我们尝试添加一些内容。我们的第一个尝试是“经济性”只是时间的线性函数,从截距值1开始并具有导数gamma> 0(gamma是sd=0.5
的半正态)。然后,我们得到了数据〜Poisson(beta_i *(1 + gamma))。在这种情况下,贝塔系数变化不大,我们确实推断出有关“经济”的一些信息,尽管影响很小。
我希望将其替换为随机游走或高斯过程,以使“经济”在时间上可以平稳地变化,但具有任意形状。理想情况下,它将从0值开始,然后到达需要捕获所有销售人员共享的潜在趋势的位置,并再次使用数据〜Poisson(beta_i *(1 + gamma))。这是我们的模型。
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)
。
首先,我不确定是否正确指定了此模型。没有“经济”,我会推断出一组合理的Beta(尽管它看上去并不像对数正常,如第二个屏幕截图所示)。然后,无论sd变得多么小,我们返回的随机游走都不会完全平滑;由于不确定的原因,我经常会收到一条有关“质量矩阵在对角线上包含零”的消息。最终,即使在开始时,如果我不向观察到的数据中添加一个小因素,我也将获得无限的概率...为什么?
所以,TL; DR:我对概率编程还很陌生,我很确定有什么问题,但是我不确定是什么。任何输入,非常感谢!