Я пытаюсь создать классификатор Наивного Байеса, который берет документ и обрабатывает документ как мешок слов и разные книги как отдельные классы, дает вероятность того, что документ эта книга (я знаю, это немного смешно, но это отправная точка для чего-то еще). Я использую это: http://www.stanford.edu/class/cs124/lec/naivebayes.pdf как о своем решении, как это сделать.Naive Bayes Классификатор - документы разной длины
Так, например, если бы у нас был документ d как «Возвращение Шерлока Холмса», то, глядя на кучу p (b | d) для кучки книг, «Возвращение Шерлока Холмса» было бы как «Приключения Шерлока Холмса», в то время как «Улисс» Джеймса Джойса будет гораздо менее вероятным.
Чтобы сделать это, я делаю p(b|d) α p(d|b)p(b)
, где p(b) = 1/(# of books)
и p(d|b)=sum over all words w in document[log(p(w|b))]
, где p(w|b) = (# of times word w appears in book b + 1)/(# of words in book b + vocabularysize)
.
Проблема заключается в том, что, когда я запускаю это, она обычно получает правильную книгу в качестве первого результата и иногда дает похожие книги с высокими результатами, но она, как правило, заполняет верхние результаты одной и той же коллекцией действительно длинных книг , и наименее вероятные книги - это всегда стихи, эссе и короткие рассказы. Когда я запускаю его на одной из этих коротких рассказов, у него все еще есть короткие документы, в том числе тот, на который я смотрел, с наименьшими или почти наименьшими ненормированными вероятностями, а наиболее вероятные книги по-прежнему остаются очень длинными , Таким образом, эта модель похожа на работу, в которой, если книга достаточно длинна, вес, придаваемый ей из ее правильных слов, будет достаточным, чтобы положить ее сверху, но если книга слишком короткая, то этого веса будет недостаточно и он будет по-прежнему находиться рядом с дном, где доминирует большая длина других книг.
Почему это происходит и как я могу исправить свою модель, чтобы этого не произошло?
Хотя вы реализуете это как упражнение для машинного обучения, я считаю, что неотъемлемый ответ на ваш вопрос является математическим, основанным на вероятностях. Возможно, вам повезло на сайте Mathematics StackExchange. Если вы считаете, что это связано с некоторой ошибкой/реализацией вашего кода, вы должны, вероятно, поделиться проблематичным битом кода. – cm2
Я подумал об этом, но здесь я увидел много вопросов Наивного Байеса, и никто из них не предложил перейти к Math StackExchange. Это скорее вопрос, связанный с алгоритмом, чем математический вопрос, поэтому я считаю, что более подходящим для него является то, что StackOverflow охватывает не просто программирование, но и алгоритмы. –