python - 如何格式化观察到的数据以在 pymc3 中用于贝叶斯网络?
问题描述
我很难理解观察到的数据在 pymc3 中是如何工作的。从我目前找到的信息来看,这 两个例子对我尽可能地帮助我最有帮助,但我无法让我的模型工作。
作为我正在尝试做的一个例子,假设我有餐厅顾客的记录,以 5 分的分类等级记录当天的温度,以及他们是否点了主餐,配菜,或饮料。我已经设置了一些模拟数据,如下所示:
import numpy as np
import pymc3 as pm
from theano import shared
no_of_root_categories = 5
no_of_samples = 1000
hot_day = np.random.randint(no_of_root_categories, size=no_of_samples)
option_labels = ["Main", "Side", "Beverage"]
meal_options = np.random.randint(2, size=(len(option_labels), no_of_samples))
我想将其建模为一个简单的贝叶斯网络,如下所示:
观察阴影节点的位置。
这就是我所拥有的:
with pm.Model() as crashing_model:
shape = (no_of_samples, no_of_root_categories)
alpha = (1 / no_of_root_categories) * np.ones(shape)
root_prior = pm.Dirichlet("Temperature Rating Prior", alpha, shape=shape)
root = pm.Categorical('Temperature Rating', p=root_p, shape=no_of_samples, observed=hot_day)
for item, label in enumerate(option_labels):
node_data = meal_options[item, :]
theano_probs = shared(np.array(node_probs))
node_prior = pm.Beta(f"{label} Prior",
mu=root,
sigma=root,
shape=no_of_samples,
testval=np.random.randint(1, size=no_of_samples))
pm.Binomial(label, p=node_prior, n=no_of_samples, observed=node_data)
哪个有效,但是当我尝试时
with crashing_model:
trace = pm.sample(1000, random_seed=0)
Python 以“初始能量差”错误退出。
我可以创建一个似乎可以在没有潜在变量的情况下工作的模型
with pm.Model() as working_model: # seems to work
root_values = [np.where(hot_day == i)[0].tolist() for i in range(no_of_root_categories)]
root_p = [len(i) / 1000 for i in root_values]
root = pm.Categorical('Temperature Rating', p=root_p)
shared_proportions = shared(np.array([len(hot_day[i]) for i in root_values]))
for item, label in enumerate(option_labels):
node_probs = [sum([meal_options[item, idx] for idx in category]) / len(category) for category in root_values]
theano_probs = shared(np.array(node_probs))
pm.Binomial(label, p=theano_probs[root], n=shared_proportions[root])
但我不确定如何翻译我在那里所做的工作以处理潜在变量。任何帮助,将不胜感激。
解决方案
在pymc3 discourse的帮助下,我得到了它的工作。我不知何故想到我需要确保所有形状都相同,但我根本不需要指定它们。下面的代码适用于其他有问题的人。
with pm.Model() as model:
shape = (no_of_samples, no_of_root_categories)
alpha = np.ones(no_of_root_categories)
root_prior = pm.Dirichlet("Temperature Rating Prior", alpha)
root = pm.Categorical('Temperature Rating', p=root_p, observed=hot_day)
for item, label in enumerate(option_labels):
node_data = meal_options[item, :]
theano_alpha_probs = shared(np.ones(no_of_root_categories))
theano_beta_probs = shared(np.ones(no_of_root_categories))
node_prior = pm.Beta(f"{label} Prior",
alpha=theano_alpha_probs[root],
beta=theano_beta_probs[root],
testval=0.5)
pm.Bernoulli(label, p=node_prior, observed=node_data)
推荐阅读
- jvm - (Javonet) 初始化 jvm 失败
- sql - SQL 查询:如何退回没有评论的产品
- android-recyclerview - 如何在 recyclerview 运行时更改所有项目的字体
- google-drive-api - 如何定期运行我的 colab 笔记本
- javascript - 使用 Velo 在 Wix 网站上单击按钮运行自定义 javascript
- ruby-on-rails - 用户在注册时发布第一个嵌套帖子,Ruby on rails
- .net - React 本机应用程序无法使用 axios 从 .net 服务器获取数据
- c# - Kafka:使用手动批处理消耗分区 - 正在跳过消息
- google-ima - 如何在不依赖主视频的情况下使用 SDK
- cqrs - CQRS - 命令/查询单个参数