pymc3中的贝叶斯更新:添加更多数据无效

2024-06-26 01:51:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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)

这不管用

我的问题是:

  • 这是否仍然考虑到我以前设置的优先级,还是它创建了一个全新的模型
  • 如上所述,代码没有工作,因为它给了我一个“坏的初始能量”错误。通过反复试验,我发现参数“n”必须是观测值中元素的总和(所以我不能让观测值相加为不同的n)。为什么呢?当然,我上面描述的情况(有些星期他们只在周一购物,而另一些星期则在周一和周四购物)并非不可能

对于这类问题,是否有更好的方法使用pymc3或其他包?谢谢大家!


Tags: 模型data客户产品asnp购物array
1条回答
网友
1楼 · 发布于 2024-06-26 01:51:25

首先回答您的具体问题:

  • 第二个模型是一个新的模型。您可以通过将行更改为with model:来重用上下文管理器,但是查看代码,这可能不是您想要做的
  • 多项式分布使用提供的概率进行n绘制,并返回一个列表^如果为n提供数组,则{}将为您广播。以下是您的模型的整洁版本:
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是否是这个问题的正确库,这很好!你写下的两个模型是众所周知的,你可以手工求解后验概率,这要快得多:第一个模型是Dirichlet([4, 3, 2, 2]),第二个模型是Dirichlet([5, 2, 1, 2])。您可以使用PyMC3或read up here确认这一点

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

相关问题 更多 >