pymc3 中的贝叶斯更新:添加更多数据不起作用

Bayesian update in pymc3: adding more data doesn't work

我是 pymc3 的新手,但我听说它可以用来构建贝叶斯更新模型。所以我尝试了,没有成功。我的目标是根据许多客户的先前信息以及该人的购物历史来预测一个人在一周中的哪一天购买某种产品。

那么假设我知道客户通常只在周一、周二、周三和周四购买该产品;那些天过去购买该产品的顾客数量分别为 3,2, 1 和 1。我想我会像这样设置我的模型:

import pymc3 as pm

dow = ['m', 'tu', 'w','th']
c = np.array([3, 2, 1, 1])

# hyperparameters (initially all equal)
alphas = np.array([1, 1, 1, 1])
with pm.Model() as model:
    # Parameters of the Multinomial are from a Dirichlet
    parameters = pm.Dirichlet('parameters', a=alphas, shape=4)
    # Observed data is from a Multinomial distribution
    observed_data = pm.Multinomial(
        'observed_data', n=7, p=parameters, shape=4, observed=c)

所以我的模型设置没有任何问题。然后我有一个客户 4 周的数据:1 表示他们在一周中的某一天购买了产品,0 表示他们没有购买。我认为更新模型会很简单:

c = np.array([[1, 0,0,0],[0,1,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,1])

with pm.Model() as model:
    # Parameters are a dirichlet distribution 
    parameters = pm.Dirichlet('parameters', a=alphas, shape=4)
    # Observed data is a multinomial distribution
    observed_data = pm.Multinomial(
        'observed_data',n=1,p=parameters,  shape=4, observed=c)    

    trace = pm.sample(draws=100, chains=2, tune=50, discard_tuned_samples=True)

这没有用。

我的问题是:

是否有更好的方法使用 pymc3 或其他包来解决此类问题?谢谢!

先回答你的具体问题:

  • 第二个模型是模型。您可以通过将行更改为 with model: 来重用上下文管理器,但查看代码,这可能不是您想要做的。
  • 多项式分布采用 n 次绘制,使用提供的概率和 returns 个列表。如果您为 n 提供数组,pymc3 将为您广播。这是您模型的整理版本:
with pm.Model() as model:
    parameters = pm.Dirichlet('parameters', a=alphas)
    observed_data = pm.Multinomial(
        'observed_data', n=c.sum(axis=-1), p=parameters, observed=c)    

    trace = pm.sample()

你还问 pymc3 是否是这个问题的正确库,这很好!你写下的两个模型是众所周知的,你可以手工求解后验,速度much:在第一个模型中,它是一个Dirichlet([4, 3, 2, 2]),在第二个Dirichlet([5, 2, 1, 2])。您可以使用 PyMC3 或 read up here 来确认这一点。

如果您想扩展模型,或者选择非共轭分布,那么 PyMC3 可能是更好的选择。