Eu li sobre o truque log-soma-exp em muitos lugares (por exemplo , aqui e aqui ), mas nunca vi um exemplo de como ele é aplicado especificamente ao classificador Naive Bayes (por exemplo, com recursos discretos e duas classes)
Como exatamente alguém evitaria o problema de subfluxo numérico usando esse truque?
naive-bayes
underflow
Josh
fonte
fonte
Respostas:
Em
o denominador e o numerador podem se tornar muito pequenos, geralmente porque pode estar próximo de 0 e multiplicamos muitos deles entre si. Para evitar vazões, pode-se simplesmente pegar o log do numerador, mas é necessário usar o truque log-soma-exp para o denominador.p(xi|Ck)
Mais especificamente, para evitar vazões:
Se nós só se preocupam com saber qual classe a entrada ( x = x 1 , ... , x n ) provavelmente pertence a com o máximo a posteriori (MAP) regra de decisão, não temos de aplicar o log- truque soma-exp, pois não precisamos calcular o denominador nesse caso. Para o numerador, pode-se simplesmente pegar o log para evitar vazões: l o g ( p ( x | Y = C ) p ( Y = C ) )(y^) (x=x1,…,xn) log(p(x|Y=C)p(Y=C)) . Mais especificamente:
que se torna após o registro:
com:
Podemos ver que a introdução da variável evita fluxos insuficientes. Por exemplo, com , temos:A k=2,a1=−245,a2=−255
Usando o truque log-sum-exp, evitamos o sub-fluxo, com :A=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)
pois está muito mais longe de 0 que ou .e−10 3.96143×10−107 1.798486×10−111
fonte
Suponha que desejemos identificar qual dos dois bancos de dados tem mais probabilidade de gerar uma frase (por exemplo, de qual novela é mais provável que essa frase tenha vindo). Poderíamos assumir a independência das palavras condicionais no banco de dados (suposição de Naive Bayes).
Agora procure o segundo link que você postou. Lá representaria a probabilidade conjunta de observar a sentença dada um banco de dados e os s representariam a probabilidade de observar cada uma das palavras na sentença.a ebt
fonte
Podemos ver nesta resposta que o menor número em Python (apenas por exemplo) se
5e-324
deve ao IEEE754 , e a causa do hardware se aplica a outros idiomas também.E qualquer flutuação menor que isso levaria a 0.
E vamos ver a função do Naive Bayes
with discrete features and two classes
conforme necessário:Permita-me instanciar essa função com uma simples tarefa de PNL abaixo.
Decidimos detectar se o e-mail a chegar é spam ( ) ou não ( ) e temos um vocabulário de palavras de 5.000 em tamanho ( ) e a única preocupação é se ocorrer uma palavra ( ) ( ) no e-mail ou não ( ) por simplicidade ( Bernoulli ingênuo Bayes ).S=1 S=0 n=5,000 wi p(wi|S=1) 1−p(wi|S=1)
Podemos ver que seria muito pequeno devido às probabilidades (ambos e estaria entre 0 e 1) em e, portanto, temos certeza de que o produto seria menor que e obtemos .p(S=s)∏ni=1p(wi|S=s) p(wi|S=1) 1−p(wi|S=1) ∏5000i 5e−324 0/0
Em seguida, surge o problema: como podemos calcular a probabilidade do email ser um spam ? Ou como podemos calcular o numerador e o denominador?p(S=1|w1,...wn)
Podemos ver a implementação oficial no sklearn :
Para o numerador, converteu o produto de probabilidades na soma da probabilidade de log e, para o denominador, usou o logsumexp em scipy, que é:
Como não podemos adicionar duas probabilidades conjuntas adicionando a probabilidade de log conjunto, devemos sair do espaço de log para o espaço de probabilidade. Mas não podemos adicionar as duas probabilidades verdadeiras porque elas são muito pequenas e devemos escalá-las e fazer a adição: e retornar o resultado no espaço do log seguida, redimensione-o novamente: no espaço de log adicionando o .∑s={0,1}ejlls−max_jll log∑s={0,1}ejlls−max_jll max_jll+log∑s={0,1}ejlls−max_jll max_jll
E aqui está a derivação:
onde é o no código.max_jll a_max
Depois de obter o numerador e o denominador no espaço do log, podemos obter a probabilidade condicional do log ( ) subtraindo o denominador do numerador :logp(S=1|w1,...wn)
Espero que ajude.
Referência:
1. Classificador Bernoulli Naive Bayes
2. Filtragem de Spam com Naive Bayes - Que Naive Bayes?
fonte