【问题标题】:Drop node from a bayesian network with bnlearn package使用 bnlearn 包从贝叶斯网络中删除节点
【发布时间】:2017-03-29 06:30:48
【问题描述】:

我用 bnlearn 建立了一个网络,但是有一些节点没有到另一个节点的边缘,所以我想删除它们。是否有从 bn 对象中删除特定节点的命令?

【问题讨论】:

    标签: r nodes bayesian-networks


    【解决方案1】:

    bnlearn 有内置的arc operations(文档也有here)就是为此而生的。这些函数还具有检查图中循环的好处,因为贝叶斯网络需要是无环的(有向无环图或 DAG),否则您会得到无限循环并且无法计算条件概率。还有一个check.illegal 参数,用于在添加弧时检查模型是否存在其他违规行为(请参阅文档)。

    但是,他们的例子不是很好,文档也不是。这些操作返回一个模型,因此您必须用返回的模型覆盖旧模型。

    data(learning.test)
    # model ends up the same every time here, but may want
    # to set random seed for reproducibility in other cases
    set.seed(42)
    model = tabu(learning.test)  # tabu is a better algo than hc I think
    plot(model)
    
    model <- set.arc(model, "A", "F")
    plot(model)
    model <- drop.arc(model, "A", "F")
    plot(model)
    

    set.edge 设置无向边,set.arc 设置有向边。

    【讨论】:

      【解决方案2】:

      所以我的尝试是使用modelstring 函数。获取字符串,删除我知道它没有任何弧/边的节点 - 我手动执行此操作 - 保存到新的修改字符串,然后使用命令 model2network 再次将字符串转换为网络。以下是命令序列:

      model.string <- modelstring(mymodel)
      model.string
      new.string <- "your string except the node you want to remove from the output above"
      new.model <- model2network(new.string)
      

      我想如果您总共没有很多节点(我有 22 个)并且您只想从列表中删除一些节点,这会起作用。

      希望有帮助!

      【讨论】:

        【解决方案3】:

        Fabiola 的回答对我帮助很大。

        这是一种无需手动更改模型字符串的方法。

        这是我第一次回答问题,所以请在格式方面放轻松。

        “net”是我的网络,“TARGET_NODE”是我想要预测的节点(我将它包含在列表中以确保我不会删除它)和“uniq”我的数据集。

        model.string <- modelstring(net)
        final_nodes <- unique(c(unlist(list(net$arcs)), TARGET_NODE))
        nodes_to_delete <- paste("\\[",setdiff(names(net$nodes), final_nodes),"]", sep = "")
        for (i in 1:length(nodes_to_delete)) {model.string <- gsub(nodes_to_delete[i], "", model.string)}
        net <- model2network(model.string)
        
        cols <- c(match(final_nodes, names(uniq)))
        uniq <- uniq[,cols]
        

        【讨论】:

        • 使用 bnlearn 内置的 drop.arc() 即可,见我的回答 here
        猜你喜欢
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        相关资源
        最近更新 更多