Мне нужно выполнить некоторые выводы в байесовской сети, например, пример, который я создал ниже.
Я пытался сделать что-то вроде этого, чтобы решить вывод, такой как P (F | A = True, B = True). Мой первоначальный подход был сделать что-то вроде
For every possible output of F
For every state of each observed variable (A,B)
For every unobserved variable (C, D, E, G)
// Calculate Probability
Но я не думаю, что это сработает, потому что на самом деле нам нужно просматривать много переменных одновременно, а не каждую за раз.
Я слышал об алгоритме Жемчуга для передачи сообщений, но мне еще предстоит найти разумное описание, которое не очень плотное. Для дополнительной информации эти байесовские сети ограничены, так как не имеют более 15-20 узлов, и у нас есть все таблицы условных вероятностей, код на самом деле не должен быть быстрым или эффективным.
В основном я ищу способ сделать это, не обязательно ЛУЧШИЙ способ сделать это.
Ваш BN не кажется особенно сложным, и я думаю, что вам легко обойтись без использования точного метода вывода, такого как алгоритм дерева соединений. Конечно, вы все еще можете просто выполнить перебор методом прямого перебора, но это будет пустой тратой ресурсов ЦП, поскольку существует так много хороших библиотек, которые реализуют более умные способы как точного, так и приблизительного вывода в графических моделях.
Поскольку ваш тег упоминает C ++, моя рекомендация будет libDAI. Это хорошо написанная библиотека, которая реализует множественный точный и приблизительный вывод на универсальном факторные графики. У него нет никаких странных зависимостей, и его очень легко интегрировать в ваш проект. Это особенно хорошо подходит для отдельных случаев, таких как ваш, для которых у вас есть таблицы вероятностей.
Теперь вы заметили, что я упомянул факторные графики. Если вы не знакомы с концепцией, я отсылаю вас к Википедия, но принцип очень прост. Вы должны представить свой BN в виде факторного графа, и тогда libDAI сделает за вас вывод.
РЕДАКТИРОВАТЬ:
Поскольку ресурсы ЦП не кажутся вам проблемой, а ключом к этому является простота, вы всегда можете использовать перечисление методом грубой силы. Идея проста. Ваша байесовская сеть представляет собой совместное распределение вероятностей, которое вы можете записать в виде уравнения, например,
P(A,B,C) = P(A|B,C) * P(B|C) * P(C)
Предполагая, что у вас есть таблицы для всех ваших распределений условной вероятности, т.е. P(A|B, C)
P(B|C)
а также P(C)
тогда вы можете просто просмотреть все возможные значения переменных A
, B
, а также C
и рассчитать выход.