2010-11-17 19 views
5

Mam tablicę Nx1, która odpowiada rozkładowi prawdopodobieństwa, tj. Suma elementów sumuje się do 1. Jest ona reprezentowana jako regularna tablica numpy. Ponieważ N może być względnie duże, np. 10 lub 20, wiele z poszczególnych elementów jest bardzo zbliżonych do 0. Znajduję, że kiedy biorę log (my_array), pojawia się błąd "FloatingPointError: niepoprawna wartość napotkana w logu". Zauważ, że jest to po ustawieniu seterr (invalid = 'raise') w numpy celowo.rejestrowanie bardzo małych wartości za pomocą numpy/scipy w Pythonie

Jak sobie z tym poradzić? Chciałbym reprezentować wektory odpowiadające rozkładowi prawdopodobieństwa i ich dziennik przejęcia bez zaokrąglania do 0, od tego czasu kończę na logowaniu (0), który podnosi błąd.

dzięki.

+0

Prawdopodobieństwo zera jest szczególnym przypadkiem, dlaczego uważasz, że jest to to samo co niezerowe prawdopodobieństwo? Dlaczego nie po prostu odfiltrować go z danych i pracować tylko z niezerowym? –

+1

Czy dwukrotnie sprawdziłeś, czy wszystkie wartości w dystrybucji są naprawdę pozytywne? Brak wartości ujemnych i żadnych wartości, które są dokładnie zerowe? Rzeczywiście małe wartości nie powinny mieć znaczenia. –

+0

Taki sam problem jak: http://stackoverflow.com/questions/3704570/in-python-small-floats-tending-to-zero – monkut

Odpowiedz

1

Jak są "blisko" do 0? Python wydaje się być szczęśliwy, biorąc dziennik 10^- bardzo duży:

>>> log(0.0000000000000000000000000001) 
-64.472382603833282 

Ponadto, dlaczego bierzesz dzienniki? Co zamierzasz z nimi zrobić po ich zabraniu?

2

Co jest całkiem blisko zera?

>>> np.log(0) 
-inf 
>>> 0.*np.log(0) 
nan 
>>> np.log(1e-200) 
-460.51701859880916 
>>> 1e-200*np.log(1e-200) 
-4.6051701859880914e-198 

Jednym z rozwiązań jest dodanie małej liczby dodatniej do wszystkich prawdopodobieństw, aby ograniczyć je do poziomu zerowego.

Drugie rozwiązanie jest uchwyt zera jawnie wymienić, na przykład 0 * np.log (0) zerami w otrzymanej tablicy lub zawierać jedynie punkty, które mają niezerowe prawdopodobieństwa w macierzy prawdopodobieństwa

2

Można po prostu upuść ogony zgodnie z potrzebną Ci dokładnością.

eps = 1e-50 
array[array<eps]=eps 
log(array) 
0

W zależności od tego, co robisz potem, można użyć innego przekształcić że nie wybuchnąć na wartości zerowych jak dziennik robi. Być może sigmoid function lub coś jeszcze z dobrze zdefiniowanym Jakobianem.

Jeśli chcesz tylko wizualizować dane, zawsze możesz dodać niewielką wartość, zanim przejdziesz do dziennika.

Powiązane problemy