2010-09-13 15 views
21

Tengo un clasificador bayesiano programado en Python, el problema es que cuando multiplico las características de las probabilidades obtengo valores de flotación MUY pequeños como 2.5e-320 o algo así, y de repente se convierte en 0.0. El 0.0 obviamente no me sirve ya que debo encontrar la "mejor" clase en función de la clase que devuelva el valor MAX (mayor valor).En Python flotadores pequeños tendiendo a cero

¿Cuál sería la mejor manera de lidiar con esto? Pensé en encontrar la parte exponencial del número (-320) y, si es demasiado bajo, multiplicar el valor por 1e20 o algún valor como ese. Pero tal vez hay una mejor manera?

+23

Esto no es matemática. En matemáticas, los números positivos pueden ser arbitrariamente pequeños. Este es un punto flotante. – recursive

+6

@S. Lott Esto definitivamente no es una pregunta matemática de ninguna manera. Esto tiene mucho que ver con los números flotantes y la forma en que funcionan en Python, así como en otros lenguajes de programación. –

+12

Creo que 2.5e-320 es la probabilidad exacta de que una ballena se convierta repentinamente en un tazón de petunias. – Seth

Respuesta

22

Lo que usted describe es un problema estándar con el clasificador ingenuo de Bayes. Puede buscar desbordamiento con eso para encontrar la respuesta. o vea here.

La respuesta corta es que es estándar para expresar todo eso en términos de logaritmos. Entonces, en lugar de multiplicar probabilidades, sumas sus logaritmos.

Es posible que desee ver otros algoritmos también para la clasificación.

+0

¡Oye! Muchas gracias por la respuesta, investigaré eso, ya que aborda mi problema exactamente. Estaba pensando que debería ser común, ya que estoy multiplicando probabilidades como 3.14e-05 varias veces, por lo que alcanzan niveles e-300 (por ejemplo) bastante rápido, incluso más cuando tengo muchas funciones en mi clasificador. – Pravel

+0

Sí, como también se menciona recursivo, esto se aborda mediante el uso de los logaritmos y la adición de las probabilidades. En el enlace provisto por Muhammad todo está explicado. ¡Gracias a todos por sus respuestas! – Pravel

3

Eche un vistazo a Decimal del stdlib.

from decimal import Decimal, getcontext 

getcontext().prec = 320 

Decimal(1)/Decimal(7) 

No estoy publicando los resultados aquí, ya que es bastante largo.

7

Floating point los números no tienen precisión infinita, por lo que viste los números pasar a 0. ¿Podría multiplicar todas las probabilidades por un escalar grande, para que sus números permanezcan en un rango superior? Si solo te preocupa el máximo y no la magnitud, ni siquiera necesitas molestarte en dividir al final. Alternativamente, podría usar un decimal de precisión infinita, como sugiere ikanobori.

17

¿Sería posible hacer su trabajo en un espacio logarítmico? (Por ejemplo, en lugar de almacenar 1e-320, solo almacene -320, y use la suma en lugar de la multiplicación)

+0

¡Oye! Tu solución parece genial. Es muy sencillo y parece bastante fácil de probar. ¡Gracias! Voy a intentarlo. – Pravel