动态贝叶斯网络-多元-重复事件-bnstruct R包
我正在寻找一种方法来训练动态贝叶斯网络(DBN),使用包bnstruct,用于从类似事件收集数据的特殊情况。因此,1)我想训练我的DBN,每次给它一个事件 与实际情况一样,事件、行和列的数量很大,2)如果可以实现一些并行处理来提高性能,那就更好了 下面提供了一个伪代码,其中所有数据必须一次输入,而不考虑事件边界动态贝叶斯网络-多元-重复事件-bnstruct R包,r,bayesian-networks,R,Bayesian Networks,我正在寻找一种方法来训练动态贝叶斯网络(DBN),使用包bnstruct,用于从类似事件收集数据的特殊情况。因此,1)我想训练我的DBN,每次给它一个事件 与实际情况一样,事件、行和列的数量很大,2)如果可以实现一些并行处理来提高性能,那就更好了 下面提供了一个伪代码,其中所有数据必须一次输入,而不考虑事件边界 library(bnstruct) numEvents <- 40 numRows <- 5 numCols <- 3 mat <- matrix(data
library(bnstruct)
numEvents <- 40
numRows <- 5
numCols <- 3
mat <- matrix(data = rnorm(numEvents * numRows * numCols), ncol = numCols)
varNames <- paste0("var", 1:numCols)
colnames(mat) <- varNames
dataset <- BNDataset(data = mat, discreteness = rep(F, ncol(mat)), variables = varNames, node.sizes = rep(3, ncol(mat)))
dbn <- learn.dynamic.network(dataset, num.time.steps = numCols)
库(bnstuct)
NumeEvents您正在生成的数据在bnstruct中被视为具有3层的DBN,每个层由一个节点组成。处理数据集作为事件序列的正确方法是在事件<代码> > <代码> >中,作为事件变量<<代码> x<代码>的不同变量,在事件<代码> j>代码>中,作为<代码>学习。也就是说,您的数据集不必通过添加行来构建,而是通过添加列来构建。
小插曲的第4.1.2节解释了如何学习DBN
在您的示例中,构造和使用数据集的正确方法是
mat <- matrix(data = rnorm(numEvents * numRows * numCols), ncol = numCols * numEvents)
varNames <- rep(paste0("var", 1:numCols), numEvents)
colnames(mat) <- varNames
dataset <- BNDataset(data = mat, discreteness = rep(F, ncol(mat)), variables = varNames, node.sizes = rep(3, ncol(mat)))
dbn <- learn.dynamic.network(dataset, num.time.steps = numEvents)
但是,每次都会重新学习整个DBN。如果边只能转到紧接着的下一层,则可以通过提供layer.struct
参数,或者通过一次使用两个事件学习并手动构建较大的DBN来修剪搜索空间
对于第二个问题,bnstruct目前不提供并行处理
library(bnstruct)
numEvents <- 40
numRows <- 5
numCols <- 3
mat <- matrix(data = rnorm(numRows * numCols), ncol = numCols)
varNames <- paste0("var", 1:numCols)
colnames(mat) <- varNames
dataset <- BNDataset(data = mat,
discreteness = rep(F, ncol(mat)),
variables = varNames,
node.sizes = rep(3, ncol(mat)))
dbn <- learn.network(dataset)
for (event in 2:numEvents) {
# collect new data
new.mat <- matrix(data = rnorm(numRows * numCols), ncol = numCols)
colnames(new.mat) <- paste0(varNames, "_", event)
mat <- cbind(mat, new.mat)
dataset <- BNDataset(data = mat,
discreteness = rep(F, ncol(mat)),
variables = colnames(mat),
node.sizes = rep(3, ncol(mat)))
# expand structure of the DBN, adding the nodes relative to the new event
dbn.dag <- dag(dbn)
n.nodes <- ncol(dbn.dag)
new.dag <- matrix(0, nrow=ncol(mat), ncol=ncol(mat))
new.dag[1:n.nodes, 1:n.nodes] <- dbn.dag
# learn
dbn <- learn.dynamic.network(dataset,
initial.network = new.dag,
num.time.steps = event)
}