2010-11-17 11 views
5

Ich habe eine Nx1-Array, die einer Wahrscheinlichkeitsverteilung entspricht, d. H. Die Summe der Elemente summiert sich zu 1. Dies wird als eine regelmäßige numpy-Array dargestellt. Da N möglicherweise relativ groß ist, z.B. 10 oder 20, viele der einzelnen Elemente sind ziemlich nahe bei 0. Ich finde, dass, wenn ich log (my_array) nehme, bekomme ich den Fehler "FloatingPointError: ungültiger Wert im Protokoll gefunden". Beachten Sie, dass dies absichtlich geschieht, nachdem setterr (invalid = 'raise') in numpy gesetzt wurde.Log von sehr kleinen Werten mit numpy/scipy in Python

Wie kann ich mit diesem numerischen Problem umgehen? Ich möchte Vektoren darstellen, die einer Wahrscheinlichkeitsverteilung und ihrem Take-Protokoll entsprechen, ohne auf 0 zu runden, da ich dann log (0) nehme, was den Fehler auslöst.

danke.

+0

Wahrscheinlichkeit von Null ist ein Sonderfall, warum würden Sie es als die gleichen Wahrscheinlichkeiten ungleich Null betrachten? Warum nicht einfach aus den Daten herausfiltern und nur mit Nicht-Null arbeiten? –

+1

Haben Sie überprüft, dass alle Werte in der Distribution wirklich positiv sind? Keine negativen Werte und keine Werte, die genau Null sind? Wirklich kleine Werte sollten keine Rolle spielen. –

+0

Gleiches Problem wie: http://stackoverflow.com/questions/3704570/in-python-small-floats-tending-to-zero – monkut

Antwort

1

Wie 'ziemlich nah' zu 0 sind sie? Python scheint glücklich Log von 10^-sehr großen:

>>> log(0.0000000000000000000000000001) 
-64.472382603833282 

Auch warum nehmen Sie Protokolle? Was hast du vor, mit ihnen zu tun, nachdem du sie genommen hast?

2

Was ist ziemlich nah an Null?

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

Eine Lösung ist eine kleine positive Zahl für alle Wahrscheinlichkeiten hinzuzufügen, sie zu beschränken von Null weit genug weg zu sein.

Die zweite Lösung ist ausdrücklich Nullen zu handhaben, beispielsweise ersetzen 0. * np.log (0) mit Nullen in dem sich ergebenden Array oder nur Punkte enthalten, die Nicht-Null-Wahrscheinlichkeit der Wahrscheinlichkeit Array

2

können Sie Lass die Schwänze einfach nach der Genauigkeit fallen, die du brauchst.

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

Je nachdem, was Sie danach tun, könnten Sie eine andere verwenden Transformation, die nicht auf Null Werte nicht explodieren wie log tut. Vielleicht ein sigmoid function oder etwas anderes mit einer gut definierten Jacobi.

Wenn Sie nur die Daten visualisieren möchten, können Sie immer einen kleinen Wert hinzufügen, bevor Sie das Protokoll erstellen.