2017-04-04 70 views
11

Próbuję pracować z pewnymi prawdopodobieństwami, które stają się bardzo małe, co powoduje problemy. Na przykładArytmetyka z bardzo małymi numerami w R

probs <- c(4.225867e-03,3.463125e-04,2.480971e-05,1.660538e-06,1.074064e-07,6.829168e-09,4.305051e-10,2.702241e-11,1.692533e-12,1.058970e-13,6.622117e-15,4.139935e-16,2.587807e-17,1.617488e-18,1.010964e-19,6.318630e-21,3.949177e-22 2.468246e-23,1.542657e-24,9.641616e-26,6.026013e-27,3.766259e-28,2.353912e-29,1.471195e-30,9.194971e-32 

Jednak każdy arytmetyczna z tego wektora powoduje wszystko po 12. Wpis do zaokrąglania do zera (prawdopodobnie dlatego, że jest mniej niż .Machine $ double.eps). Na przykład:

probs > 0 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

ale

1-probs < 1 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

Próbowałem przy użyciu pakietu GMP ale robię obliczeń opartych combinatoric i as.bigq (probs) dostaje bardzo powolny, gdy podniesiona do dużych mocach.

Jakieś sposoby obejścia tego?

+11

Aby obejść tego rodzaju problemy, często pracujemy z logarytmicznymi prawdopodobieństwami, dzięki czemu można zsumować prawdopodobieństwa zamiast pomnażania (co często jest przyczyną małych prawdopodobieństw). – Marius

+2

@Marius Nieco zaskakujące, że nie wydaje się to duplikatem (może nie przeszukałem poprawnie). Byłoby miło mieć kanoniczną odpowiedź na temat wykorzystania prawdopodobieństw dzienników w R, aby poprawić dokładność liczbową. Być może mógłbyś rozwinąć swój komentarz i uczynić go odpowiedzią. –

+0

@JohnColeman Czy naprawdę potrzebujemy ustalić strategię prawdopodobieństwa logowania dla każdego języka osobno? Wiem, że widziałem podobne pytania w innych językach. –

Odpowiedz

6

Przypadek bardzo małych prawdopodobieństw pojawia się często w uczeniu maszynowym i innych zagadnieniach związanych z obliczeniami statystycznymi. Otrzymujesz błąd precyzji z powodu ograniczeń wewnętrznej reprezentacji liczb zmiennoprzecinkowych. Można to rozwiązać za pomocą arbitralnej arytmetyki precyzyjnej, ale nie jest to często wykonywane.

Najpopularniejszym rozwiązaniem jest użycie l og transformation to represent your probabilities, a następnie użycie dodatku zamiast mnożenia. Jest to nazywane log-wiarygodność. Ta transformacja pozwala uniknąć problemu bardzo małych liczb, a ponadto wartości logarytmu wiarygodności można wykorzystać bezpośrednio do porównania prawdopodobieństwa rzeczy (niższe prawdopodobieństwo wiarygodności zawsze oznacza mniejsze prawdopodobieństwo).

Zauważ, że istnieje subtle distinction between likelihood and probability, ale transformacja logu zamieniająca bardzo małe liczby na ujemne z mniejszą różnorodnością liczby miejsc dziesiętnych działa niezależnie.