问题描述
我想从条件贝叶斯网络中抽取样本(即一些没有父节点的输入节点没有附加分布),给定输入节点值,使用 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 (将#修改为@)