首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中含bnstruct动态贝叶斯网络的层设置

R中含bnstruct动态贝叶斯网络的层设置
EN

Stack Overflow用户
提问于 2020-05-07 15:45:47
回答 2查看 327关注 0票数 2

我目前正在使用R中的bnstruct包创建一个DBN,我在每6个时间步骤中有9个变量。我有生物和非生物变量。我想防止生物变量成为非生物variables.For的父母--一种贝叶斯网络,很容易实现,例如在learn.dynamic.network()中使用layering = c(1,1,2,2,2)

但动态部分出现了一个问题:我希望在每一时间步骤中防止生物变量成为非生物变量的父母,同时防止从t+1到t的任何变量之间出现边缘。

如果我在layering =中使用

  • 1表示非生物变量在t1
  • 2生物变量在t1
  • 3非生物变量在t2
  • 4在t2.

F 212

我允许t-1中的生物变量解释t的非生物变量(我不想那样)。

所以我试着:

代码语言:javascript
运行
复制
## 9 variables for 6 time steps 
test1 <- BNDataset(data = timedData,
                   discreteness = rep('d', 54),
                   variables = colnames(timedData),
                   node.sizes = rep(c(3,3,3,2,2,3,3,3,3), 6)
                   # num.time.steps = 6
                   )


## the 5 first variables are abiotic, the 4 last are biotics
dbn <- learn.dynamic.network(test1, 
                             num.time.steps = 6, 
                             layering = rep(c(1,1,1,1,1,2,2,2,2),6))

所以现在,我没有从生物到非生物的任何边缘(这很好),但是我有从variable_t(n+1)到variable_t(n)的边。

我知道,在bnlearn中,您可以创建一个“黑名单”,列出您不想看到的边,但我在bnstruct中没有看到任何等价的参数。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-08 08:25:32

使用默认的mmhc算法,您可以使用layer.struct参数来指定哪些层之间允许有边缘。layer.struct采用二进制矩阵,其中单元格i,j1,如果可以从层i中的变量到层j中的变量,则为0

使用此方法的最佳方法是将其与手动指定的第一个解决方案分层相结合。

票数 2
EN

Stack Overflow用户

发布于 2020-05-08 13:58:59

很好,layering =layer.struct =这两个参数的结合可以实现我想要的效果。

我在这里所用的内容只是为了提供一个例子:

代码语言:javascript
运行
复制
## DBN study
dbn <- learn.dynamic.network(test1, 
                             num.time.steps = 6, 
                             layering = rep(c(1,1,1,1,1,2,2,2,2,  # set 2 layers per time step
                                              3,3,3,3,3,4,4,4,4,
                                              5,5,5,5,5,6,6,6,6,
                                              7,7,7,7,7,8,8,8,8,
                                              9,9,9,9,9,10,10,10,10,
                                              11,11,11,11,11,12,12,12,12)),
                             layer.struct = matrix(c(1,0,0,0,0,0,0,0,0,0,0,0,  ## allow certain layers to connect to others by hand
                                                     1,1,0,0,0,0,0,0,0,0,0,0,
                                                     1,0,1,0,0,0,0,0,0,0,0,0,
                                                     1,1,1,1,0,0,0,0,0,0,0,0,
                                                     1,0,1,0,1,0,0,0,0,0,0,0,
                                                     1,1,1,1,1,1,0,0,0,0,0,0,
                                                     1,0,1,0,1,0,1,0,0,0,0,0,
                                                     1,1,1,1,1,1,1,1,0,0,0,0,
                                                     1,0,1,0,1,0,1,0,1,0,0,0,
                                                     1,1,1,1,1,1,1,1,1,1,0,0,
                                                     1,0,1,0,1,0,1,0,1,0,1,0,
                                                     1,1,1,1,1,1,1,1,1,1,1,1),c(12,12)))

谢谢你的快速答复和包裹

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61662014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档