Gibt es verbesserte Möglichkeiten zur Berechnung von

11

Die meisten Mathematikbibliotheken verfügen über eine Reihe von Versionen von Logarithmusfunktionen. Die meiste Zeit gehen wir davon aus, dass sie perfekt sind, aber tatsächlich bieten ziemlich viele von ihnen nur eine bestimmte Anzahl von Stellen mit Präzision.

Für einige Funktionen gibt es numerisch stabilere Varianten. Zum Beispiel haben Fortran, R, Java und C beide Math.log1pfür die Berechnung log(1.0+x)(die eine höhere Genauigkeit für kleine Werte von x bietet) und das Gegenstück expm1. Hier ergeben sich die numerischen Probleme aus einem Genauigkeitsverlust - wenn er xwirklich klein ist, 1.0 + xverliert er Ziffern, um die 1 am Anfang beizubehalten.

Ich habe solche Funktionen für eine höhere Präzision in einer Reihe von Situationen gesehen. Dies scheint häufig vorzukommen, wenn Sie Verteilungsfunktionen (Gamma, Beta, Poisson usw.) mit hoher numerischer Genauigkeit implementieren. Zum Beispiel scheint die Gamma-Funktion die meiste Zeit als verwendet zu werden logGamma. Im Allgemeinen kann das Aufrufen von "Logspace" die Genauigkeit erheblich verbessern, und daher scheint R bei den meisten Funktionen ein "Logspace" -Flag zu haben.

Ein weiteres Beispiel in R gibt es log1mexpfür log(1 - exp(p)): http://cran.r-project.org/web/packages/Rmpfr/vignettes/log1mexp-note.pdf

Ich habe mit entropie- und informationstheoretischen Maßnahmen herumgespielt. Ein sehr häufiger Begriff gibt es

p * -log(p)

wo normalerweise möchte man, dass die Basis des Logarithmus 2 ist, nicht e; aber genauso oft ist dies nur ein linearer Faktor, und Sie können auch den natürlichen Logarithmus verwenden (daher ist dies für mich nicht von zentraler Bedeutung). Wie auch immer, wissen Sie, ob es eine schnellere / direktere / präzisere Methode gibt, diesen Begriff zu berechnen? Ich habe es überall, also könnte es sich wirklich auszahlen, es ein bisschen präziser und schneller zu machen (ersparen Sie mir das übliche Zeug zur "vorzeitigen Optimierung", danke).

Ich sehe keinen offensichtlichen Grund, der zu einem Präzisionsverlust führen würde. Ich bin also hauptsächlich daran interessiert, ob es einen netten Trick gibt, um diese Berechnung zu beschleunigen. Das erspart mir vielleicht sogar die Behandlung des p=0Eckfalls (was sinnvoll ist 0, obwohl es log(0)ihn nicht gibt) oder gibt mir Basis 2 kostenlos (obwohl eine einzelne Multiplikation mit einer Konstanten offensichtlich nicht mörderisch teuer ist). Vielen Dank.

Hat aufgehört - Anony-Mousse
quelle
1
m10308pM10308|logp|700plogpp=0
R wird mit einer log2Funktion geliefert, die je nach Betriebssystem ein einfacher Wrapper sein log/log(2)oder die Tatsache nutzen kann, dass C99 eine log2Funktion hinzugefügt hat .
anonym

Antworten:

11

plogp[0,1]0

p ? p * -log(p) : 0
Geoffrey Irving
quelle