#python-3.x #naivebayes #hidden-markov-models #bayesian-networks
#python-3.x #naivebayes #скрытые-марковские-модели #байесовские сети
Вопрос:
Я совершенно новичок в области байесовских сетей. Для моего проекта мне нужно проверить все возможные условия разделения d, существующие в 7-узловой базе данных, и для этого я ищу хороший код на python. Мои знания в программировании ограничены (немного численного анализа и структур данных; но я довольно хорошо понимаю разделение d, разделение e и другие концепции в dag).
Было бы действительно очень полезно, если бы кто-нибудь мог указать, где искать такой конкретный код. Пожалуйста, обратите внимание, что мне нужны коды python, которые проверяют все условные независимости, вытекающие из общего разделения, в базе данных с 7 узлами.
Я был бы счастлив с алгоритмом, проверяющим, заблокирован ли каждый путь или нет и т. Д., А Не с алгоритмом, построенным на полуграфоидных аксиомах.
Я не знаю точно, где я должен искать или к кому я должен обратиться, поэтому буду признателен за любую помощь.
Ответ №1:
Я думаю, вы понимаете, что ваше требование — это очень большой список. Даже если мы рассматриваем только d-разделение только между 2 переменными (обусловленными набором узлов).
В любом случае, вы можете сделать это довольно легко с помощью pyAgrum (https://agrum.org )
import itertools
import pyAgrum as gum
# create a BN
bn=gum.fastBN("A->B<-C->D->E->F;B->E<-G");
# print the indepency model by testing d-separations
# how to iterate for each subset of an interable
def powerset(iterable):
"""
powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)
"""
xs = list(iterable)
# note we return an iterator rather than a list
return itertools.chain.from_iterable(itertools.combinations(xs,n) for n in range(len(xs) 1))
# testing every d-separation
for i in bn.names():
for j in bn.names()-{i}:
for k in powerset(bn.names()-{i,j}):
if bn.isIndependent(i,j,k):
print(f"{i} indep {j} given {k}")
И результат (в записной книжке) :
Комментарии:
1. Пожалуйста, обновите свой ответ, чтобы также включить первый фрагмент кода в виде текста .
2. Я добавил 2 строки для создания байесовской сети. Поскольку этот фрагмент не обязательно предназначен для ноутбука, я не поместил 2 строки, которые отображают его в виде ориентированного графика (в блокноте). Спасибо!