Вот почему я задаю этот вопрос: В прошлом году я написал код на 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» в противном случае. Но некоторые модели будут иметь узлы, которые принимают целочисленные значения в некотором диапазоне, в то время как другие будут логическими.
Раньше мне было сложно программировать подобные вещи. Я не собираюсь врать; было скопировано и вставлено изрядное количество кода, и иногда мне приходилось распространять изменения в одном методе на несколько файлов. На этот раз я действительно хочу потратить время, чтобы сделать это правильно.
Некоторые варианты:
Некоторые варианты:
Некоторые варианты:
Большое спасибо за вашу помощь.
Обновление: Здесь очень помогают объектно-ориентированные идеи (каждый узел имеет назначенный набор узлов-предшественников определенного подтипа узла, и каждый узел имеет функцию правдоподобия, которая вычисляет его вероятность различных состояний результата с учетом состояний узлов-предшественников и т. Д.). OOP FTW!