2017-02-14 17 views
1

bnstructは、私は、データが同様のイベントから収集された特殊な場合のために、パッケージbnstructを使用して、ダイナミックベイジアンネットワーク(DBN)を訓練するための方法を探しています。それで、1)DBNに1回のイベントで時間を与えるように訓練したいと思います。イベント、行と列の数が大きいです実際の場合と同様にダイナミックベイジアンネットワーク - 多変量 - 繰り返しイベント - Rパッケージ

、いくつかの並列処理もパフォーマンスを改善するために実装することができれば、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) 

ありがとうございます。

答えて

2

あなたが生成されているデータは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は並列処理を提供していません。