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)
这没有用。
我的问题是:
- 这还是考虑了我之前设置的先验,还是创建了一个全新的模型?
- 如上所述,代码无法运行,因为它给了我一个 "bad initial energy" 错误。通过反复试验,我发现参数 "n" 必须是观察中元素的总和(因此我不能将观察加起来为不同的 n)。这是为什么?当然,我上面描述的情况(有些星期他们只在星期一购物,而其他星期星期一和星期四)不是不可能的吗?
是否有更好的方法使用 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 可能是更好的选择。
我是 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)
这没有用。
我的问题是:
- 这还是考虑了我之前设置的先验,还是创建了一个全新的模型?
- 如上所述,代码无法运行,因为它给了我一个 "bad initial energy" 错误。通过反复试验,我发现参数 "n" 必须是观察中元素的总和(因此我不能将观察加起来为不同的 n)。这是为什么?当然,我上面描述的情况(有些星期他们只在星期一购物,而其他星期星期一和星期四)不是不可能的吗?
是否有更好的方法使用 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 可能是更好的选择。