3 votos

¿Cómo calcular los cocientes cuando los números son extremadamente pequeños y pueden surgir problemas numéricos?

Consideremos que un conjunto de números que se pueden escribir de la forma $b^{x}$ (para alguna base):

$$A = \{ a_1, ..., a_n\}$$

por ejemplo tal vez $\{ 2^{-2000}, 2^{-2002}, 2^{-2500}\}$ . Supongamos también que podemos calcular los números indirectamente porque conocemos sus exponentes (es decir, estamos en el espacio logarítmico). Quiero calcular:

$$ \alpha_i = \frac{ a_i}{\sum^n_{i=1} a_i}$$

sin tropezar con problemas numéricos (el problema numérico surge porque el original $a_i$ son tan pequeños que el numerador y el denominador están tan próximos a cero que cualquier objeto de cálculo razonable [con precisión acotada $\epsilon$ ] tiene un error al intentar calcular el cociente anterior, es decir, intenta calcular aproximadamente $\frac{0}{0}$ y, por tanto, un error).

Una forma que me dijeron de hacerlo es "reescalando" los números. En el sentido, podemos reescalar A de tal manera que el mayor tiene magnitud 1 y, a continuación, realizar el cálculo para $\alpha_i$ . La corrección matemática del cálculo de alfa es obvia (con reescalado), ya que el término max divide arriba y abajo (se anula y la proporción se calcula correctamente).

Dejemos que la de mayor magnitud se denote por $a^* = argmax_{a \in A}\{a\} $ . Matemáticamente, esto implicaría calcular un nuevo conjunto a escala $A'$ como sigue:

$$ A' = \{ \frac{a_1}{ a^*} , ..., \frac{a_n}{ a^*} \} = \{ a'_1 , ..., a'_n \}$$

mi pregunta es, ¿por qué elegimos dividir por el mayor $a^*$ y no el más pequeño? Otra forma de ver esto podría ser, si todos se pueden escribir como un exponente, estamos eligiendo el que tiene el exponente más positivo. ¿Cuál es el problema de elegir el exponente más negativo. (obviamente, no calcularíamos la división directamente y en su lugar calcularíamos la diferencia de los exponentes, para evitar el problema potencial de desbordamiento, es decir, trabajar en logspace y por lo tanto los exponentes directamente, de modo que no tengamos el problema de desbordamiento al hacer $\frac{a_i}{ a^*}$ ).

Mi intuición me dice que en realidad deberíamos dividir por el más pequeño, ya que es el que podría ser demasiado pequeño para nuestros cálculos (y por lo tanto el que queremos normalizar). Considerémoslo así, digamos que escribimos todos los números en $A$ es la forma exponencial, es decir $a_i = 2^{e_i}$ . Supongamos que $e_i \leq 0$ . A continuación, para resolver el problema que podemos hacer:

$$ 2^{e_i - y}$$

donde queremos hacer $e_i - y$ menos negativo (para que la exponenciación no nos lleve a cerca de cero). Para ello queremos $-y$ muy positiva. Así que en este objetivo elegimos $y$ para ser el exponente más negativo que podemos tener. Por lo tanto, elegimos el exponente más pequeño que corresponde a la más pequeña $a_i$ . Eso es lo que tiene sentido para mi. ¿Pero elegir el máximo también funciona? Si es así, ¿por qué funciona?

En el $A = \{ 2^{-2000}, 2^{-2002}, 2^{-2500}\}$ y $A' = \{ 1, 2^{-2}, 2^{-500}\}$ y por lo tanto, si la precisión de nuestro ordenador es $2^{-1023}$ a $2^{1023}$ parece que este truco funciona. Sin embargo, no estaba seguro de si este truco funcionaría siempre o en qué condiciones funcionaría o por qué elegir el más grande era una buena idea y no el más pequeño.

1voto

Shabaz Puntos 403

Cuando se trata de cantidades positivas, lo único que se desea es mantener todos los números dentro del intervalo. Sus ejemplos originales están fuera del rango supuesto de su ordenador de $2^{-1023}$ a $2^{1023}$ así que no puedes añadirlos. Cualquier cambio de escala que los ponga a todos en el mismo rango funcionará bien. Si reescalas por el más pequeño obtienes $A''=\{2^{500},2^{498},1\}$ que están dentro del rango. Si los datos originales tuvieran un rango más amplio, lo mejor sería reescalar por la mitad del rango: la media geométrica del máximo y el mínimo. Así, si $B=\{2^{-2000}, 2^{-2500}, 2^{-4000}\}$ reescalando por el máximo se obtiene $B'=\{1,2^{-500},2^{-2000}\}$ que no los pone a todos a tiro. Reescalando por el mínimo tampoco, pero por el medio da $B''=\{2^{1000},2^{500},2^{-1000}\}$ que funciona bien.

Cuando se trata de cantidades positivas y negativas, hay que preocuparse por la cancelación sustractiva, que es otro tema.

0voto

naslundx Puntos 6179

Usted menciona el problema potencial de desbordante y ese es exactamente el problema. En el caso general no obtendrá el bonito $b^x$ para alguna base $b$ para cada número, por lo que no se puede simplemente hacer cálculos sobre los exponentes.

Normalmente, el reescalado en términos del número mayor funciona. Si tiene operaciones aritméticas repetidas y tiene problemas con esto, puede realizar múltiples recalificaciones . Esto es muy común en el paso de normalización del Baum-Welch algoritmo, por ejemplo.

0 votos

Supongamos que tenemos $b^x$ :p, quizás debería haber dicho que me refería a ese caso concreto. Pero su observación es importante. Obviamente, esta pregunta es fácil de responder es que no es el caso. es decir, usted está jodido.

0 votos

@Pinocchio Si lo hacemos, entonces no necesitamos el bit de reescalado en absoluto, sólo trabajar en los exponentes. Pero ese no es el caso general :)

0 votos

En realidad no es cierto, la aplicación que estoy utilizando no funciona sin el truco anterior. Además, proporcioné un ejemplo específico, con una lista de números (y la precisión de la computadora) que no funciona a menos que haga ese truco que mencioné ... ¿verdad? ¿O tiene algún error?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X