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

时间:2017-02-14 08:26:28

标签: r bayesian-networks

我正在寻找一种方法来训练动态贝叶斯网络(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)

感谢。

1 个答案:

答案 0 :(得分:2)

您生成的数据在bnstruct中被视为具有3个层的DBN,每个层包含一个节点。将数据集视为事件序列的正确方法是将事件X中的变量i视为事件X中与同一变量j不同的变量,如learn.dynamic.network只是learn.network的代理,具有隐式分层。也就是说,您的数据集不必通过添加行来构建,而是通过添加列来构建。 小插图的第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将有120个有效节点,分为40层。

提出第一个问题:一个想法是提供一个初始网络作为连续时间步骤的起点。假设时间步t+1的数据集是通过向时间步t使用的数据集添加新列获得的,则必须手动调整BN对象以表示数据集。

从包装小插图:

  

也可以提供初始网络作为起点   结构搜索。这可以使用initial.network参数来完成   接受三种输入:

     
      
  • 一个BN对象(带结构);
  •   
  • a matrix包含表示a的结构的邻接矩阵   网络;
  •   
  • 字符串random.chain,用于从随机抽样的链式开始   网络
  •   

最简单的选择可能是在每次扩充时使用0扩展DAG,使网络具有更多节点,并且没有边缘进入新节点,并将新DAG用作启动点。在您的示例中:

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)

}

然而,每次都会重新学习整个DBN。如果边缘只能到达紧接的后续图层,则可以通过提供layer.struct参数或通过一次学习使用两个事件并手动构建更大的DBN来修剪搜索空间。

对于第二个问题,bnstruct目前不提供并行处理。