Bnlearn: прогнозирование значений нескольких узлов

Я использую r-пакет «bnlearn» для работы с построенной мной байесовской сетью:

bn.gs <- gs(x = dat, cluster = NULL, whitelist = wl, blacklist = bl, test = NULL, alpha = 0.05, B = NULL, debug = FALSE, optimized = TRUE, strict = FALSE, undirected = FALSE)

Это дает мне хороший сюжет, и все, кажется, работает хорошо. Все переменные являются непрерывными и находятся в диапазоне от -1 до 1. Переменные кормления (те, у кого нет родителей) были сгенерированы, как показано ниже (N = 1000):

A <- runif(N, min=-1, max=1)

Предположим, что моими переменными являются A, B, ... Z, и я знаю значения C, G и M. Теперь я хотел бы предсказать значения остальных узлов (A, B, D, .. .) с учетом C, G и M. Насколько мне известно, predict() работает для одного узла за раз.

Есть ли метод для одновременного прогнозирования нескольких узлов, или я должен в конечном итоге получить правильные значения, применяя прогнозирование () к каждому узлу за раз? Я уже пытался предсказать значение для узла "A", учитывая значение "C":

predict(bn.gs, node = "A", testdata, debug = TRUE)

где testdata — это фрейм данных в такой форме:

A    B    C    D    E    ...
0.0  0.0  0.7  0.0  0.0  ...

но я получаю это:

* predicting values for node A.
  > prediction for observation 1 is nan with predictor:
    (0.000000) + (0.000000) * (nan) + (0.000000) * (nan)
[1] NA

Я уверен, что я делаю что-то неправильно здесь. В моей сети есть дуги C -> S -> A. Также «нан» странные, так как моя сеть должна быть четко определена.

Спасибо уже :).


person VesaH    schedule 05.05.2015    source источник
comment
Насколько мне известно, в bnlearn нет возможности прогнозировать более одного узла за раз. Вы можете использовать цикл или функцию применения в bnlearn или загрузить Genie (другое программное обеспечение). Genie может настроить вероятности для всех узлов одновременно.   -  person Michal    schedule 19.05.2015


Ответы (1)


На всякий случай, если другие тоже могут искать ответ, я решил эту проблему с помощью пакета rbmn. После создания объекта bn с помощью bnlearn я сделал следующее:

my.bn.par <- bn.fit(x = bn.gs, data = dat)

library("rbmn")

my.bn.par.rbmn <- bnfit2nbn(my.bn.par)
print8nbn(my.bn.par.rbmn)
my.bn.par.mn <- nbn2mn(my.bn.par.rbmn)

# This is the names vector for my nodes:
names <- c("A","B","C","D","E")

# Names of given variables
obsnames <- c("C","E")

# Values for given variables
obsval <- c(0.51,-0.24)

# Names of variables to be predicted
prednames <- setdiff(names, obsnames)

# Then predict all the unknown variables
print8mn(condi4joint(my.bn.par.mn, par = prednames, pour = obsnames, x2 = obsval))

Метод был представлен в книге Марко Скутари «Байесовские сети».

person VesaH    schedule 03.11.2015