0

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

例如,如果我有离散网络:A -> B,我想在给定 A 的数据向量的情况下为 B 绘制随机值。我可以使用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 发表评论后,我尝试使用 predict 的性能比 impute 好得多,但不确定如何,因为文档说“'impute()' 是基于 'predict()'”。

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

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

4

0 回答 0