2017-02-14 8 views
1

비슷한 이벤트에서 데이터를 수집하는 특수한 경우에 bnstruct 패키지를 사용하여 동적 베이지안 네트워크 (DBN)를 학습하는 방법을 찾고 있습니다. 그렇기 때문에, 1) 시간당 하나의 이벤트로 DBN에 먹이를 주도록 훈련시키고 싶습니다.동적 베이지안 네트워크 - 다 변수 - 반복 이벤트 - bnstruct 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

생성하는 데이터는 bnstruct에서 3 개의 레이어가있는 DBN으로 처리되며 각 노드는 단일 노드로 구성됩니다. 데이터 집합을 일련의 이벤트로 처리하는 올바른 방법은 i 이벤트의 변수 Xj의 동일한 변수 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 개 효과적인 노드를 가질 것입니다.

첫 번째 질문 : 한 가지 아이디어는 연속적인 시간 단계의 시작점으로 초기 네트워크를 제공하는 것입니다. 시간 단계 의 데이터 집합이 시간 단계 t에 사용 된 데이터 집합에 새 열을 추가하여 얻은 것으로 가정하면 데이터 집합을 나타내도록 BN 개체를 수동으로 조정해야합니다. 패키지에서 비네팅

:

그것은 구조 검색을위한 출발점으로서 초기 네트워크를 제공하는 것도 가능하다. 이것은 는 세 종류의 입력을 받아들이는 initial.network 인수를 사용하여 수행 할 수있다 : (a 구조)

  • 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 매개 변수를 제공하거나 한 번에 두 개의 이벤트를 사용하여 학습하고 더 큰 DBN을 수동으로 구축하여 검색 공간을 정리할 수 있습니다.

두 번째 질문의 경우 현재 bnstruct는 병렬 처리를 제공하지 않습니다.