питоническая реализация байесовских сетей для конкретного приложения

Вот почему я задаю этот вопрос: В прошлом году я написал код на C ++ для вычисления апостериорных вероятностей для определенного типа модели (описываемой байесовской сетью). Модель работала довольно хорошо, и некоторые другие люди начали использовать мое программное обеспечение. Теперь я хочу улучшить свою модель. Поскольку я уже кодирую несколько иные алгоритмы вывода для новой модели, я решил использовать python, потому что время выполнения не было критически важным, и python может позволить мне сделать более элегантный и управляемый код.

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

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

Для конкретной сети и наблюдаемых данных мне нужно написать функцию, которая вычисляет вероятность неназначенных переменных в модели.

Например, в классической сети «Азия» ( http://www.bayesserver.com/Resources/Images/AsiaNetwork.png ) с состояниями «XRay Result» и «Одышка. "известно, мне нужно написать функцию для вычисления вероятности того, что другие переменные имеют определенные значения (согласно какой-то модели).

Вот мой вопрос по программированию: Мне нужно написать функцию, которая вычисляет вероятность неназначенных переменных в модели.

Например, в классической сети «Азия» ( http://www.bayesserver.com/Resources/Images/AsiaNetwork.png ) с состояниями «XRay Result» и «Одышка. "известно, мне нужно написать функцию для вычисления вероятности того, что другие переменные имеют определенные значения (согласно какой-то модели).

Вот мой вопрос по программированию: Мне нужно написать функцию, которая вычисляет вероятность неназначенных переменных в модели.

Например, в классической сети «Азия» ( http://www.bayesserver.com/Resources/Images/AsiaNetwork.png ) с состояниями «XRay Result» и «Одышка. "известно, мне нужно написать функцию для вычисления вероятности того, что другие переменные имеют определенные значения (согласно какой-то модели).

Вот мой вопрос по программированию: Мне нужно написать функцию для вычисления вероятности того, что другие переменные имеют определенные значения (согласно некоторой модели).

Вот мой вопрос по программированию: Мне нужно написать функцию для вычисления вероятности того, что другие переменные имеют определенные значения (согласно некоторой модели).

Вот мой вопрос по программированию: Я собираюсь попробовать несколько моделей, и в будущем, возможно, я захочу попробовать еще одну модель после этого. Например, одна модель может выглядеть точно так же, как азиатская сеть. В другой модели может быть добавлено направленное преимущество от «Посещение Азии» до «Имеет рак легких». В другой модели может использоваться исходный ориентированный граф, но модель вероятности для узла «Одышка» с учетом узлов «Туберкулез или рак» и «Имеет бронхит» может быть другой. Все эти модели будут вычислять вероятность по-разному.

Все модели будут существенно перекрываться; например, несколько ребер, входящих в узел «ИЛИ», всегда будут давать «0», если все входы равны «0», и «1» в противном случае. Но некоторые модели будут иметь узлы, которые принимают целочисленные значения в некотором диапазоне, в то время как другие будут логическими.

Раньше мне было сложно программировать подобные вещи. Я не собираюсь врать; было скопировано и вставлено изрядное количество кода, и иногда мне приходилось распространять изменения в одном методе на несколько файлов. На этот раз я действительно хочу потратить время, чтобы сделать это правильно.

Некоторые варианты:

  1. Я уже делал это правильно. Сначала кодируйте, потом задавайте вопросы. Быстрее копировать и вставлять код и иметь по одному классу для каждой модели. Мир - темное и неорганизованное место ... Было довольно много скопированного и вставленного кода, и иногда мне приходилось распространять изменения в одном методе на несколько файлов. На этот раз я действительно хочу потратить время, чтобы сделать это правильно.

    Некоторые варианты:

    1. Я уже делал это правильно. Сначала кодируйте, потом задавайте вопросы. Быстрее копировать и вставлять код и иметь по одному классу для каждой модели. Мир - темное и неорганизованное место ... Было довольно много скопированного и вставленного кода, и иногда мне приходилось распространять изменения в одном методе на несколько файлов. На этот раз я действительно хочу потратить время, чтобы сделать это правильно.

      Некоторые варианты:

      1. Я уже делал это правильно. Сначала кодируйте, потом задавайте вопросы. Быстрее копировать и вставлять код и иметь по одному классу для каждой модели. Мир - темное и неорганизованное место ...
      2. Каждая модель представляет собой отдельный класс, но также является подклассом общей модели байесовской сети. Эта общая модель будет использовать некоторые функции, которые будут переопределены. Страуструп был бы горд.
      3. Сделайте несколько функций в одном классе, которые вычисляют разные вероятности.
      4. Закодируйте общую библиотеку байесовской сети и реализуйте мои задачи вывода в виде конкретных графов, считываемых этой библиотекой. Узлам и ребрам должны быть присвоены такие свойства, как «Boolean» и «OrFunction», которые, учитывая известные состояния родительского узла, могут использоваться для вычисления вероятностей различных результатов. Эти строки свойств, такие как OrFunction, могут даже использоваться для поиска и вызова нужной функции. Может быть, через пару лет я сделаю что-то похожее на версию Mathematica 1988 года!

      Большое спасибо за вашу помощь.

      Обновление: Здесь очень помогают объектно-ориентированные идеи (каждый узел имеет назначенный набор узлов-предшественников определенного подтипа узла, и каждый узел имеет функцию правдоподобия, которая вычисляет его вероятность различных состояний результата с учетом состояний узлов-предшественников и т. Д.). OOP FTW!

34
задан user 27 March 2012 в 22:04
поделиться