我是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
绘制,并返回一个列表^如果为n
提供数组,则{您还询问
pymc3
是否是这个问题的正确库,这很好!你写下的两个模型是众所周知的,你可以手工求解后验概率,这要快得多:第一个模型是Dirichlet([4, 3, 2, 2])
,第二个模型是Dirichlet([5, 2, 1, 2])
。您可以使用PyMC3或read up here确认这一点如果您想扩展模型,或者选择非共轭分布,那么PyMC3可能是更好的选择
相关问题 更多 >
编程相关推荐