Czytałem o sztuczce log-sum-exp w wielu miejscach (np. Tutaj i tutaj ), ale nigdy nie widziałem przykładu, w jaki sposób jest ona stosowana konkretnie do klasyfikatora Naive Bayes (np. Z funkcjami dyskretnymi i dwiema klasami)
Jak dokładnie można uniknąć problemu niedopełnienia liczb przy użyciu tej sztuczki?
naive-bayes
underflow
Josh
źródło
źródło
Odpowiedzi:
In
zarówno mianownik i licznik może być bardzo mała, zwykle dlatego, że może być zbliżona do 0 i mnożymy wielu z nich ze sobą. Aby zapobiec niedomiarom, można po prostu wziąć log licznika, ale trzeba użyć lewy log-sum-exp dla mianownika.p(xi|Ck)
Mówiąc dokładniej, aby zapobiec niedomiarom:
Jeśli interesują nas tylko wiedząc, jakiej klasy wejście ( x = x 1 , ... , x n ) najprawdopodobniej należy do z maksimum a posteriori (MAP) reguły decyzyjnej, nie musimy stosować log- sztuczka sum-exp, ponieważ w tym przypadku nie musimy obliczać mianownika . W przypadku licznika można po prostu wziąć dziennik, aby zapobiec niedomiarom: l o g ( p ( x | Y = C ) p ( Y = C ) )(y^) (x=x1,…,xn) log(p(x|Y=C)p(Y=C)) . Dokładniej:
który staje się po pobraniu dziennika:
z:
Widzimy, że wprowadzenie zmiennej pozwala uniknąć niedomiarów. Np. Przy , mamy:A k=2,a1=−245,a2=−255
Używając sztuczki log-sum-exp, unikamy niedomiaru, a :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)
niedomiaru, ponieważ jest znacznie dalej od 0 niż lub .e−10 3.96143×10−107 1.798486×10−111
źródło
Załóżmy, że chcemy ustalić, która z dwóch baz danych prawdopodobnie wygenerowała frazę (na przykład, która powieść jest bardziej prawdopodobna z tej frazy). Możemy założyć niezależność słów zależnych od bazy danych (założenie Naive Bayes).
Teraz wyszukaj drugi opublikowany link. Tam reprezentuje wspólne prawdopodobieństwo zaobserwowania zdania w bazie danych, a s reprezentuje prawdopodobieństwo zaobserwowania każdego słowa w zdaniu.a ebt
źródło
Widzimy z tej odpowiedzi, że najmniejsza liczba w Pythonie (tylko weźmy na przykład)
5e-324
wynika z IEEE754 , a przyczyna sprzętowa dotyczy również innych języków.A każda liczba zmienna mniejsza niż ta prowadziłaby do 0.
Zobaczmy funkcję Naive Bayes
with discrete features and two classes
zgodnie z wymaganiami:Pozwólcie, że utworzę tę funkcję przez proste zadanie poniżej NLP.
Postanawiamy wykryć, czy nadchodzący e-mail jest spamem ( ), czy nie spamem ( ), i dysponujemy słownikiem słów o wielkości 5000 ( ), a jedynym problemem jest to, czy pojawi się słowo ( ) ( ) w e-mailu lub nie ( ) dla uproszczenia ( Bernoulli naiwny Bayes ).S=1 S=0 n=5,000 wi p(wi|S=1) 1−p(wi|S=1)
Widzimy, że byłoby bardzo małe ze względu na prawdopodobieństwo (oba i będzie między 0 a 1) w , a zatem jesteśmy pewni, że produkt będzie mniejszy niż i otrzymamy po prostu .p(S=s)∏ni=1p(wi|S=s) p(wi|S=1) 1−p(wi|S=1) ∏5000i 5e−324 0/0
Potem pojawia się problem: jak obliczyć prawdopodobieństwo, że wiadomość e-mail jest spamem ? Lub jak obliczyć licznik i mianownik?p(S=1|w1,...wn)
Oficjalne wdrożenie możemy zobaczyć w sklearn :
Dla licznika przekształcił iloczyn prawdopodobieństwa w sumę prawdopodobieństwa logarytmicznego, a dla mianownika użył logsumexp w scipy, który jest:
Ponieważ nie możemy dodać dwóch wspólnych prawdopodobieństw, dodając prawdopodobieństwo wspólnego dziennika, i powinniśmy wyjść z przestrzeni dziennika do przestrzeni prawdopodobieństwa. Ale nie możemy dodać dwóch prawdziwych prawdopodobieństw, ponieważ są one za małe i powinniśmy je przeskalować i dodać: i odłożyć wynik z powrotem do przestrzeni logów a następnie przeskaluj ponownie: w przestrzeni dziennika, dodając .∑s={0,1}ejlls−max_jll log∑s={0,1}ejlls−max_jll max_jll+log∑s={0,1}ejlls−max_jll max_jll
A oto pochodna:
gdzie jest w kodzie.max_jll a_max
Gdy otrzymamy zarówno licznik, jak i mianownik w przestrzeni dziennika, możemy uzyskać prawdopodobieństwo warunkowe dziennika ( ), odejmując mianownik od licznika :logp(S=1|w1,...wn)
Mam nadzieję, że to pomaga.
Odniesienie:
1. Klasyfikator Bernoulliego naiwnego Bayesa
2. Filtrowanie spamu za pomocą Naive Bayesa - Który Naive Bayesa?
źródło