Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态贝叶斯网络-多元-重复事件-bnstruct R包_R_Bayesian Networks - Fatal编程技术网

动态贝叶斯网络-多元-重复事件-bnstruct R包

动态贝叶斯网络-多元-重复事件-bnstruct R包,r,bayesian-networks,R,Bayesian Networks,我正在寻找一种方法来训练动态贝叶斯网络(DBN),使用包bnstruct,用于从类似事件收集数据的特殊情况。因此,1)我想训练我的DBN,每次给它一个事件 与实际情况一样,事件、行和列的数量很大,2)如果可以实现一些并行处理来提高性能,那就更好了 下面提供了一个伪代码,其中所有数据必须一次输入,而不考虑事件边界 library(bnstruct) numEvents <- 40 numRows <- 5 numCols <- 3 mat <- matrix(data

我正在寻找一种方法来训练动态贝叶斯网络(DBN),使用包bnstruct,用于从类似事件收集数据的特殊情况。因此,1)我想训练我的DBN,每次给它一个事件

与实际情况一样,事件、行和列的数量很大,2)如果可以实现一些并行处理来提高性能,那就更好了

下面提供了一个伪代码,其中所有数据必须一次输入,而不考虑事件边界

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)

}