簡體   English   中英

使用bnlearn包從貝葉斯網絡中刪除節點

[英]Drop node from a bayesian network with bnlearn package

我用bnlearn構建了一個網絡,但是有些節點的另一個節點沒有邊緣,因此我想刪除它們。 是否有命令從bn對象中刪除特定節點?

bnlearn具有內置的arc操作 (也在此處提供文檔)。 這些功能還具有檢查圖形中循環的好處,因為貝葉斯網絡需要是非循環的(有向無環圖或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設置有向邊緣。

因此,我對此的嘗試是使用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個),而您只想從列表中刪除幾個節點,那將是可行的。

希望有幫助!

法比奧拉的回答對我有很大幫助。

這是一種執行此操作的方法,但無需手動更改模型字符串。

這是我第一次回答問題,因此,關於格式,請對我方便。

“ 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM