あなたが生成されているデータは3層、単一のノードからなる各々とDBNとしてbnstructで処理されます。イベントのシーケンスとしてデータセットを処理する正しい方法は、イベントi
の変数X
を、イベントj
の同じ変数X
とは異なる変数とみなすことです。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
では40層に分かれ120個の有効なノードを有することになります。
最初の質問には、1つのアイデアは、連続したタイムステップの開始点として初期ネットワークを提供することです。時間ステップt+1
のデータセットが時間ステップt
で使用されるデータセットに新しい列を追加することによって得られたと仮定すると、BN
オブジェクトをデータセットを表すように手動で適合させる必要があります。パッケージビネットから
:
それは 構造検索のための出発点として、初期ネットワークを提供することも可能です。これは は、入力の三種類受け付けinitial.network
引数、使用して行うことができる:(構造で)
BN
- オブジェクトを、
- ネットワークの構造を表す隣接行列を含む
matrix
。
- ランダムにサンプリングされたチェーン状の ネットワークから開始するための文字列
random.chain
。
最も簡単なオプションは、複数のノードとネットワーク、および新しいノードに行く無しエッジを持つこと、およびように、その新しいDAGを使用するために、すべての増強で0
秒で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
パラメータを指定するか、一度に2つのイベントを使用して学習し、より大きなDBNを手作業で構築することによって、検索スペースをトリミングすることができます。
2番目の質問では、現時点でのbnstructは並列処理を提供していません。