2015-06-17 4 views
0

У меня есть двухклассная проблема классификации Байеса с четырьмя непрерывными функциями. Я пытаюсь частично воспроизвести алгоритм алгоритмов байков, который использует Orange для расчета вероятностей. Но мне не удалось получить те же значения, что и оранжевые.Алгоритм Orange Bayes с непрерывными функциями

набор

данных Размер: 150 (class0: 88 и class1: 62)

Я использую следующий алгоритм

p(class0 | X1, X2, X3, X4) = L0/(L0 + L1) 
p(class1 | X1, X2, X3, X4) = L1/(L0 + L1) 

где L0 и L1 являются Вероятности

L0 = prior_class0 * product(p(Xi|class0)) 
L1 = prior_class1 * product(p(Xi|class1)) 

prior_class0 and prior_class1 are Laplacian estimators 

prior_class0 = (88 + 1)/(150 + 2) 
prior_class1 = (62 + 1)/(150 + 2) 

Orange использует лесс для вычисления условных вероятностей (я думаю, его не нужно воспроизводить). Для этого набора данных он выводит 49 точек для обоих классов, как указано в python object classifier.conditional_distributions. Используя линейную интерполяцию между соседними точками для Xi, я могу вычислить p (Xi | class0) и p (Xi | class1).

1) Можно ли комментировать алгоритм Orange Bayes с непрерывными функциями?

2) Или любой технический совет, как настроить компилятор/IDE, чтобы я мог отлаживать код Orange C++ и проверять некоторые промежуточные результаты от функций в оранжевом/источнике/оранжевом/bayes.cpp?

ответ

0

Оранжевый использует немного другую формулу, которая, по словам Кононенко, дает тот же результат, но позволяет лучше интерпретировать и m-оценку вероятностей. Вместо произведения (p (Xi | class0)) он вычисляет произведение (p (класс0 | Xi)/p (класс0)). Я не думаю, что это должно повлиять на ваши вычисления, но вы можете проверить. Код, вычисляющий эти вероятности, равен https://github.com/biolab/orange/blob/master/source/orange/bayes.cpp#L169. Обратите внимание, что он делает это для всех классов параллельно.

Другой фрагмент кода, который вас интересует, - это вычисление вероятностей из оценок LOESS плотности. Он находится в https://github.com/biolab/orange/blob/master/source/orange/estimateprob.cpp#L307. Обратите внимание, что большинство операций есть на векторах, например. все переменные в *result *= (x-x1)/(x2-x1); являются фактически векторами.

Что касается отладки, я написал этот код (много лет назад и несколько стыдно признаться - видя ужасный стиль кодирования, который использовал) с Visual Studio. Я забыл версию и не могу ее проверить, так как я больше не использую Windows. Но я никогда не отлаживал Orange на любой другой ОС.

Если вы загружаете проект и строите отладочную версию, вам также потребуется построить отладочную версию Python. Это на самом деле просто (см. Инструкции в исходном коде Python), проблема в том, что вам придется создавать отладочную версию любых других бинарных библиотек, которые вы используете (например, numpy). Более простой способ - создать версию Orange, но включить флаги информации об отладке. Таким образом, вы можете использовать стандартные Python и библиотеки.

+0

Спасибо за ответ! Разделение p (class0 | Xi)/p (класс0) делает разницу, и теперь я получаю те же результаты, что и в выходе Orange. Таким образом, вероятность рассчитывается для ex L0 = before_class0 * product (p (Xi | class0)/p (class0)). Однако возникает вопрос, как эта формула связана с теоремой Байеса? если я правильно понимаю, то по теореме Байеса вероятность вычисляется путем умножения предыдущей вероятности с условными вероятностями, как в исходном сообщении. Можете ли вы дать некоторую ссылку на оправдание формулы, которую использует оранжевый, поскольку я не очень хорошо знаком с классификацией байков? –