使用 bnlearn 从条件贝叶斯网络中抽取样本

时间:2021-06-17 09:46:53

标签: r bayesian-networks bnlearn

我想从条件贝叶斯网络中抽取样本(即一些没有父节点的输入节点没有附加分布),给定输入节点值,使用 bnlearn。我尝试过的解决方案效率低下,鉴于我们可以在这种情况下执行前向采样,我希望它与 rbn 一样有效。

例如,如果我有离散网络:A -> B,我想为 B 绘制随机值,给定 A 的数据向量。我可以使用 impute(非常低效)或生成随机数据使用 rbn,根据我的输入条件进行过滤并随机选择一行(这也是低效的,因为丢弃了很多样本​​)。

例如,这是一个基本的 A -> B 网络:

library(bnlearn)

# Basic custom network
net <- as.bn("[A][B|A]")
# A is my input node.
cptA <- matrix(c(0.5, 0.5), ncol = 2, dimnames = list(NULL, c("blue", "red")))
cptB <- matrix(c(0.3, 0.7, 0.8, 0.2), ncol = 2, 
  dimnames = list("B" = c("bad", "good"), "A" = c("blue", "red")))
bnfit <- custom.fit(net, dist = list(A = cptA, B = cptB))

这里是“估算”的尝试:

library(tictoc)
n <- 100000
data <- data.frame(A = factor(c(rep("blue", 0.3 * n), rep("red", 0.7 * n)), levels = c("blue", "red")),
                   B = factor(rep(NA, n), levels = c("bad", "good")))

# A bit hacky, disable check.data, which throws an error when there is a full missing columns
check.data <- function(...){}
assignInNamespace("check.data", check.data, ns = "bnlearn")

tic(); r <- impute(bnfit, data, n = 1); toc()
# 53.165 sec elapsed

相比:

tic(); r2 <- rbn(bnfit, 100000); toc()
# 0.026 sec elapsed

我是否遗漏了什么,还是应该手动实现?

编辑:在 user20650 的评论之后,我尝试使用比impute 更好的性能预测,不确定如何,因为文档说“‘impute()’基于‘predict()’”。

tic(); p <- predict(bnfit, data = data, node = "B", method = "bayes-lw", n = 1); toc()
# 0.374 sec elapsed

更合理的时间,但仍然比 rbn 慢 15 倍(1M 行慢 150 倍)。我仍然有点害怕它如何随着网络规模而扩展。我会调查一下。

0 个答案:

没有答案