Mise en œuvre de Naive Bayes

10

J'implémente un algorithme Naive Bayes pour la catégorisation de texte avec lissage laplacien. Le problème que j'ai est que la probabilité approche de zéro parce que je multiplie de nombreuses petites fractions. Par conséquent, la probabilité donne finalement zéro. En effet, il y a plusieurs mots dans les documents et les ensembles de formation.

Pour cette raison, je ne suis pas en mesure de classer les textes. Existe-t-il un moyen de contourner ce problème? Suis-je en train de faire quelque chose de mal dans ma mise en œuvre?

sam
la source
... Vous pourriez éviter l'arithmétique à virgule flottante.
msdn.microsoft.com/en-us/magazine/jj891056.aspx Vous trouverez ici une réponse simple.
Roshan Mehta

Réponses:

14

L'astuce habituelle pour éviter ce sous-dépassement est de calculer avec des logarithmes, en utilisant l'identité Autrement dit, au lieu d'utiliser des probabilités, vous utilisez leurs logarithmes. Au lieu de les multiplier, vous les ajoutez.

logi=1npi=i=1nlogpi.

Une autre approche, moins courante, consiste à normaliser le produit manuellement. Au lieu de conserver un seul nombre à virgule flottante , vous conservez un nombre à virgule flottante (disons) et un exposant négatif tel que . Après chaque opération, vous normalisez le nombre résultant.px p = p 0 2 xp0[1,2)xp=p02x

Yuval Filmus
la source
2
Il est également utile de noter l'astuce logsumexp dans ce contexte: en.wikipedia.org/wiki/LogSumExp
Bitwise