Реализация python с разделением D

#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}")
 

И результат (в записной книжке) :

использование pyAgrum для списка разделяемых разделений

Комментарии:

1. Пожалуйста, обновите свой ответ, чтобы также включить первый фрагмент кода в виде текста .

2. Я добавил 2 строки для создания байесовской сети. Поскольку этот фрагмент не обязательно предназначен для ноутбука, я не поместил 2 строки, которые отображают его в виде ориентированного графика (в блокноте). Спасибо!