float decimals decimales and python floating-point numerical-stability

decimals - python float()



En Python las carrozas pequeñas tienden a cero (4)

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 qué clase devuelve el valor MAX (mayor valor).

¿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?


Eche un vistazo a Decimal desde stdlib.

from decimal import Decimal, getcontext getcontext().prec = 320 Decimal(1) / Decimal(7)

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


Lo que describes es un problema estándar con el clasificador ingenuo de Bayes. Puede buscar desbordamiento con eso para encontrar la respuesta. o mira aquí .

La respuesta corta es que es estándar 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.


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


Los números flotantes no tienen una precisión infinita, por lo que viste que los números cambian a 0. ¿Podrías multiplicar todas las probabilidades por un escalar grande, para que tus números permanezcan en un rango más alto? 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.