J'ai lu à propos de l'astuce log-sum-exp à de nombreux endroits (par exemple ici et ici ) mais je n'ai jamais vu un exemple de la façon dont il est appliqué spécifiquement au classifieur Naive Bayes (par exemple avec des fonctionnalités discrètes et deux classes)
Comment éviterait-on exactement le problème du sous-dépassement numérique en utilisant cette astuce?
Réponses:
En
le dénominateur et le numérateur peuvent devenir très petits, généralement parce que le peut être proche de 0 et nous en multiplions plusieurs entre eux. Pour éviter les débordements, on peut simplement prendre le journal du numérateur, mais il faut utiliser l'astuce log-sum-exp pour le dénominateur.p(xi|Ck)
Plus précisément, pour éviter les débordements:
Si nous ne se soucient que de savoir quelle classe l'entrée ( x = x 1 , ... , x n ) le plus appartient probablement avec le maximumune règle de décisionposteriori (MAP), nous ne devons pas appliquer la log- astuce somme-exp, puisquenous n'avons pas à calculer le dénominateurdans ce cas. Pour le numérateur on peut simplement prendre le log pour éviter les débordements: l o g ( p ( x | Y = C ) p ( Y = C ) )(y^) (x=x1,…,xn) log(p(x|Y=C)p(Y=C)) . Plus précisement:
qui devient après avoir pris le journal:
Si nous voulons calculer la probabilité de classe , nous devrons calculer le dénominateur:p ( Y= C| x )
Le log de l' élément ( ∑ | C | k = 1Journal( ∑ | C|k = 1p ( x | Y= Ck) p ( Y= Ck) ) peut déborder car peut être très petit: c'est le même problème que dans le numérateur, mais cette fois nous avons une sommation à l'intérieur du logarithme, ce qui nous empêche de transformer le p ( x i | C k ) (peut être proche de 0) dans log ( p ( x i | C k ) ) (négatif et plus proche de 0, puisque 0 ≤ p ( x i | C k ) ≤ 1p ( xje| Ck) p ( xje| Ck) Journal( p ( xje| Ck) ) 0 ≤ p ( xje| Ck) ≤ 1 ). Pour contourner ce problème, nous pouvons utiliser le fait que pour obtenir:p ( xje| Ck) = exp( journal( p ( xje| Ck) ) )
À ce stade, un nouveau problème se pose: peut être assez négatif, ce qui implique que exp ( loglog(p(x|Y=Ck)p(Y=Ck)) peut devenir très proche de 0, c'est-à-dire un débordement. C'est là que nous utilisons l'astuce log-sum-exp:exp(log(p(x|Y=Ck)p(Y=Ck)))
avec:
On voit que l'introduction de la variable évite les débordements. Par exemple avec k = 2 , a 1 = - 245 , a 2 = - 255 , nous avons:A k=2,a1=−245,a2=−255
En utilisant l'astuce log-sum-exp, nous évitons le sous-dépassement, avec : log ∑ k e a kA=max(−245,−255)=−245 log∑keak=log∑keakeA−A=A+log∑keak−A=−245+log∑keak+245=−245+log(e−245+245+e−255+245)=−245+log(e0+e−10)
Nous avons évité le sous-dépassement car est beaucoup plus éloigné de 0 quee−10 ou 1,798486 × 10 - 111 .3.96143×10−107 1.798486×10−111
la source
Supposons que nous voulons identifier laquelle des deux bases de données est la plus susceptible d'avoir généré une phrase (par exemple, de quel roman cette phrase est plus susceptible de provenir). Nous pourrions supposer l'indépendance des mots conditionnelle à la base de données (hypothèse Naive Bayes).
Recherchez maintenant le deuxième lien que vous avez publié. Il représenterait la probabilité conjointe d'observer la phrase donnée une base de données et l' e b t s représenterait la probabilité d'observer chacun des mots dans la phrase.a ebt
la source
Nous pouvons voir à partir de cette réponse que le plus petit nombre en Python (prenez-le par exemple) est
5e-324
dû à l' IEEE754 , et la cause matérielle s'applique également aux autres langages.Et tout flotteur plus petit que cela conduirait à 0.
Et voyons la fonction de Naive Bayes
with discrete features and two classes
selon vos besoins:Permettez-moi d'instancier cette fonction par un simple soufflet de tâche PNL.
Nous pouvons voir l'implémentation officielle dans sklearn :
Pour le numérateur, il a converti le produit des probabilités en la somme du log vraisemblance et pour le dénominateur, il a utilisé le logsumexp en scipy qui est:
Et voici la dérivation:
J'espère que cela pourra aider.
Référence:
1. Bernoulli Naive Bayes Classifier
2. Filtrage des spams avec Naive Bayes - Quels Naive Bayes?
la source