1

我正在尝试将 PyMC3 模型拟合到一些有关随着时间推移的销售数据。这是一个简短的描述:

  • N 个销售人员每人每周销售一定数量的小部件
  • 我们假设每个销售人员每周以不同的平均速度销售小部件,并将销售人员 i 称为 beta_i
  • 我们观察到的数据被假设为~Poisson(beta_i)。

每周平均销售数据以直方图的形式绘制,顶部采用对数正态拟合,让您了解销售人员每周小部件销售的分布情况。 在此处输入图像描述

在第一个场景中,我得到了我认为合理的 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:我对概率编程相当陌生,我很确定出了什么问题,但我不确定是什么。非常感谢任何输入!

4

0 回答 0