Existe-t-il des méthodes améliorées de calcul de


11

La plupart des bibliothèques mathématiques ont un certain nombre de versions de fonctions logarithmes. La plupart du temps, nous supposons qu'ils sont parfaits, mais en fait, beaucoup d'entre eux n'offrent qu'un certain nombre de chiffres de précision.

Pour certaines fonctions, il existe des variantes numériquement plus stables. Par exemple, Fortran, R, Java et C ont tous deux Math.log1p, pour l'informatique log(1.0+x)(qui offre une plus grande précision pour les petites valeurs de x), et l'homologue expm1. Ici, les problèmes numériques découlent d'une perte de précision - s'il xest vraiment petit, 1.0 + xperd des chiffres afin de conserver le 1 au début.

J'ai vu de telles fonctions pour une précision accrue dans un certain nombre de situations. Cela semble assez courant lorsque vous implémentez des fonctions de distribution (Gamma, Beta, Poisson, etc.) avec une grande précision numérique. Par exemple, la fonction Gamma semble être la plupart du temps utilisée comme logGamma. En général, aller dans "logspace" peut améliorer beaucoup la précision, et donc R semble avoir un indicateur "logspace" sur la plupart des fonctions.

Un autre exemple, en R, existe log1mexppour log(1 - exp(p)): http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf

J'ai joué avec l'entropie et les mesures théoriques de l'information. Un terme très courant est

p * -log(p)

où habituellement, on voudrait que la base du logarithme soit 2, pas e; mais tout aussi souvent, ce n'est qu'un facteur linéaire, et vous pouvez également utiliser le logarithme naturel (ce n'est donc pas d'une importance capitale pour moi). Quoi qu'il en soit, savez-vous s'il existe un moyen plus rapide / plus direct / plus précis de calculer ce terme? Je l'ai partout, donc ça pourrait vraiment être payant pour le rendre un peu plus précis et rapide (sauvez-moi les trucs habituels "d'optimisation prématurée", merci).

Je ne vois aucune raison évidente qui entraînerait une perte de précision. Je suis donc surtout intéressé s'il existe une astuce intéressante pour accélérer ce calcul. Cela m'évite peut-être même de traiter le p=0cas du coin (ce qui est raisonnable 0, bien qu'il log(0)n'existe pas) ou me donne gratuitement la base 2 (bien qu'une seule multiplication avec une constante ne soit évidemment pas coûteuse). Merci.


1
m10308pM10308|logp|700plogpp=0

R est livré avec une log2fonction qui, selon votre système d'exploitation, peut être un simple wrapper log/log(2)ou utiliser le fait que C99 a ajouté une log2fonction.
anonyme

Réponses:


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.