exponencial - ¿Desbordamiento en exp en scipy/numpy en Python?
numpy exp (5)
¿No es exp(log(a) - log(b))
lo mismo que exp(log(a/b))
que es lo mismo que a/b
?
>>> from math import exp, log
>>> exp(log(100) - log(10))
10.000000000000002
>>> exp(log(1000) - log(10))
99.999999999999957
2010-12-07: Si esto es así, "algunos valores de la matriz b están configurados intencionalmente en 0", entonces esencialmente se está dividiendo por 0. Eso suena como un problema.
¿Qué hace el siguiente error:
Warning: overflow encountered in exp
en scipy / numpy usando Python generalmente significa? Estoy calculando una proporción en forma de registro, es decir, log (a) + log (b) y luego tomo el exponente del resultado, usando exp, y usando una suma con logsumexp, de la siguiente manera:
c = log(a) + log(b)
c = c - logsumexp(c)
algunos valores en la matriz b se establecen intencionalmente en 0. Su registro será -Inf.
¿Cuál podría ser la causa de esta advertencia? Gracias.
Creo que puedes usar este método para resolver este problema:
Normalizado
Superé el problema en este método. Antes de usar este método, la precisión de mi clasificación es: 86%. Después de usar este método, la precisión de mi clasificación es: 96% !!! ¡Es genial!
primero:
Escala min-max
segundo:
Estandarización Z-score
Estos son métodos comunes para implementar la normalization
.
Yo uso el primer método. Y lo altero. El número máximo se divide por 10. Entonces, el número máximo del resultado es 10. ¡Entonces exp (-10) no se overflow
!
Espero que mi respuesta te ayude! (^_^)
Cuando necesita lidiar con exponencial, rápidamente entra en flujo por debajo o por encima, ya que la función crece muy rápidamente. Un caso típico es la estadística, donde sumar exponenciales de diversas amplitudes es bastante común. Dado que los números son muy grandes / pequeños, uno generalmente toma el registro para permanecer en un rango "razonable", el llamado dominio de registro:
exp(-a) + exp(-b) -> log(exp(-a) + exp(-b))
Los problemas siguen surgiendo porque exp (-a) seguirá subdesbordándose. Por ejemplo, exp (-1000) ya está por debajo del número más pequeño que puede representar como doble. Así por ejemplo:
log(exp(-1000) + exp(-1000))
da -inf (log (0 + 0)), aunque puede esperar algo así como -1000 a mano (-1000 + log (2)). La función logsumexp lo hace mejor, extrayendo el máximo del conjunto de números y sacándolo del registro:
log(exp(a) + exp(b)) = m + log(exp(a-m) + exp(b-m))
No evita el desbordamiento por completo (si a y b son muy diferentes, por ejemplo), pero evita la mayoría de los problemas de precisión en el resultado final
En mi caso, se debió a grandes valores en los datos. Tuve que normalizar (dividir por 255, porque mis datos estaban relacionados con las imágenes) para reducir los valores.
En su caso, significa que b
es muy pequeño en algún lugar de su matriz, y está obteniendo un número ( a/b
o exp(log(a) - log(b))
) que es demasiado grande para cualquier tipo de dtype (float32 , float64, etc) la matriz que está utilizando para almacenar la salida es.
Numpy se puede configurar para
- Ignora este tipo de errores,
- Imprima el error, pero no emita una advertencia para detener la ejecución (el valor predeterminado)
- Registrar el error,
- Dar una advertencia
- Levantar un error
- Llama a una función definida por el usuario
Vea numpy.seterr
para controlar cómo maneja los desbordamientos / subdesbordamientos, etc. en arreglos de punto flotante.