Байесовская сеть в Python: как построение, так и выборка

Для проекта мне нужно создать синтетические категориальные данные, содержащие определенные зависимости между атрибутами. Это можно сделать путем выборки из заранее определенной байесовской сети. После некоторого поиска в Интернете я обнаружил, чтоPomegranate- хороший пакет для байесовских сетей, однако, насколько я понимаю, выборку из такой заранее определенной байесовской сети невозможно. В качестве примера,model.sample() поднимает NotImplementedError(несмотря на то, что это решение говорит так).

Кто-нибудь знает, существует ли библиотека, которая обеспечивает хороший интерфейс для построения и выборки байесовской сети?

4 ответа

Решение

Я обнаружил, что PyAgrum (https://agrum.gitlab.io/pages/pyagrum.html) выполняет свою работу. Оба могут использоваться для создания байесовской сети черезBayesNet() класса и для выборки из такой сети с помощью .drawSamples() метод из BNDatabaseGenerator() класс.

Используя pyAgrum, вам просто нужно:

#import pyAgrum
import pyAgrum as gum

# create a BN
bn=gum.fastBN("A->B[3]<-C{yes|No}->D")
# specify some CPTs (randomly filled by fastBN)
bn.cpt("A").fillWith([0.3,0.7])

# and then generate a database
gum.generateCSV(bn,"sample.csv",1000,with_labels=True,random_order=False) 
# which returns the LL(database)

код в записной книжке

См. http://webia.lip6.fr/~phw/aGrUM/docs/last/notebooks/ для получения дополнительных записных книжек с использованием pyAgrum.

Отказ от ответственности: я один из авторов pyAgrum:-)

Другой вариант - pgmpy, библиотека Python для обучения (структуры и параметров) и вывода (статистического и причинного) в байесовских сетях.

Вы можете генерировать образцы пересылки и отклонения в виде фрейма данных Pandas или numpy recarray.

Следующий код генерирует 20 прямых выборок из байесовской сети "diff -> grade <- intel" в виде recarray.

from pgmpy.models.BayesianModel import BayesianModel
from pgmpy.factors.discrete import TabularCPD
from pgmpy.sampling import BayesianModelSampling

student = BayesianModel([('diff', 'grade'), ('intel', 'grade')])

cpd_d = TabularCPD('diff', 2, [[0.6], [0.4]])
cpd_i = TabularCPD('intel', 2, [[0.7], [0.3]])
cpd_g = TabularCPD('grade', 3, [[0.3, 0.05, 0.9, 0.5], [0.4, 0.25, 0.08, 0.3], [0.3, 0.7, 0.02, 0.2]], ['intel', 'diff'], [2, 2])

student.add_cpds(cpd_d, cpd_i, cpd_g)
inference = BayesianModelSampling(student)
df_samples = inference.forward_sample(size=20, return_type='recarray')

print(df_samples)

Я также искал библиотеку на python для работы с байесовскими сетями, обучением, выборкой, логическим выводом, и я нашел bnlearn. Я попробовал пару примеров, и это сработало. Можно импортировать несколько существующих репозиториев или любой тип.bif. Согласно этой библиотеке,

Выборка данных основана на прямой выборке из совместного распределения байесовской сети. Для этого на входе требуется DAG, связанный с CPD. Также возможно создать DAG вручную (см. Раздел "Создание DAG") или загрузить уже существующий.

Другой вариант - Bayespy (https://www.bayespy.org/index.html). Вы строите сеть, используя узлы. И на каждом узле вы можете позвонитьrandom()который по сути является образцом из его распространения: https://www.bayespy.org/dev_api/generated/generated/bayespy.inference.vmp.nodes.stochastic.Stochastic.random.html

Другие вопросы по тегам