我正在寻找一种方法来训练动态贝叶斯网络(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)
感谢。
答案 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目前不提供并行处理。