微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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),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 倍)。我仍然有点害怕它如何随着网络规模而扩展。我会调查一下。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。