Un problema muy común en Markov Chain Monte Carlo implica calcular probabilidades que son la suma de términos exponenciales grandes,
donde los componentes de lata pueden variar de muy pequeños a muy grandes. Mi enfoque ha sido factorizar el término exponencial más grande para que:
Este enfoque es razonable si todos los elementos de son grandes, pero no es una buena idea si no lo son. Por supuesto, los elementos más pequeños no contribuyen a la suma de punto flotante de todos modos, pero no estoy seguro de cómo tratarlos de manera confiable. En el código R, mi enfoque se ve así:
if ( max(abs(a)) > max(a) )
K <- min(a)
else
K <- max(a)
ans <- log(sum(exp(a-K))) + K
Parece un problema bastante común que debería haber una solución estándar, pero no estoy seguro de cuál es. Gracias por cualquier sugerencia
monte-carlo
floating-point
statistics
cboettig
fuente
fuente
Respuestas:
Hay una solución sencilla con solo dos pasos a través de los datos:
Primer cálculo
que le dice que, si hay términos, entoncesn
Como presumiblemente no tiene cerca de , no debe preocuparse por desbordarse en el cálculo de con doble precisión .n 1020
Por lo tanto, calcule y luego su solución es e K τ .τ eKτ
fuente
Para mantener la precisión mientras agrega dobles, debe usar Kahan Summation , este es el software equivalente a tener un registro de acarreo.
Esto está bien para la mayoría de los valores, pero si obtiene un desbordamiento, entonces está alcanzando los límites de la precisión doble IEEE 754, que sería aproximadamente . En este punto necesitas una nueva representación. Puede detectar un desbordamiento en el momento de la adición y también detectar exponentes demasiado grandes para evaluarlos . En este punto, puede modificar la interpretación de un doble cambiando el exponente y haciendo un seguimiento de este cambio.mi709.783
doubleMax - sumSoFar < valueToAdd
exponent > 709.783
En su mayor parte, esto es similar a su enfoque de compensación de exponente, pero esta versión se mantiene en la base 2 y no requiere una búsqueda inicial para encontrar el exponente más grande. Por lo tanto, .v a l u e × 2s h i f t
fuente
Tu enfoque es sólido.
fuente
Hay un paquete R que proporciona una implementación rápida y eficiente del "truco log-sum-exp"
http://www.inside-r.org/packages/cran/matrixStats/docs/logSumExp
La función logSumExp acepta un vector numérico lX y genera el registro (sum (exp (lX))) mientras evita problemas de desbordamiento y desbordamiento utilizando el método que usted describió.
fuente