Реализация Наивного Байеса

10

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

Из-за этого я не могу классифицировать тексты. Есть ли способ, которым я могу обойти эту проблему? Я делаю что-то не так в своей реализации?

Сэм
источник
... Вы можете избежать арифметики с плавающей точкой.
msdn.microsoft.com/en-us/magazine/jj891056.aspx Вы найдете легкий ответ здесь.
Рошан Мехта

Ответы:

14

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

logi=1npi=i=1nlogpi.

Другой подход, который не так распространен, заключается в нормализации продукта вручную. Вместо того, чтобы хранить только одно число плавающей точкой , вы сохраняете число с плавающей точкой (скажем) и отрицательный показатель степени такой что . После каждой операции вы нормализуете полученный номер.pp0[1,2)xp=p02x

Юваль Фильмус
источник
2
Также полезно отметить трюк logsumexp в этом контексте: en.wikipedia.org/wiki/LogSumExp
Побитовый