Катастрофическая отмена в логах


18

Я пытаюсь реализовать следующую функцию с плавающей запятой двойной точности с низкой относительной ошибкой:

LограммsUм(Икс,Y)знак равножурнал(ехр(Икс)+ехр(Y))

Это широко используется в статистических приложениях для добавления вероятностей или плотностей вероятностей, представленных в лог-пространстве. Конечно, или могут легко переполниться или опуститься, что было бы плохо, потому что пространство журнала используется во-первых, чтобы избежать потери. Это типичное решение:ехр(Икс)ехр(Y)

LограммsUм(Икс,Y)знак равноИкс+Lограмм1п(ехр(Y-Икс))

Отмена от действительно происходит, но смягчается . Хуже всего, когда и близки. Вот график относительной ошибки:Y-ИксехрИксLограмм1п(ехр(Y-Икс))

введите описание изображения здесь

График обрезан в чтобы подчеркнуть форму кривой , относительно которой происходит отмена. Я видел ошибку до и подозреваю, что она становится намного хуже. (FWIW, функция «наземной правды» реализована с использованием MPFR с плавающей точкой произвольной точности с 128-битной точностью.) l o g s u m ( x , y ) = 0 10 - 1110-14LограммsUм(Икс,Y)знак равно010-11

Я пробовал другие формулировки, все с тем же результатом. С в качестве внешнего выражения возникает та же ошибка, если взять что-то около 1. При в качестве внешнего выражения во внутреннем выражении происходит отмена.l o g 1 pжурналLограмм1п

Теперь абсолютная ошибка очень мала, поэтому имеет очень маленькую относительную ошибку (в пределах эпсилона). Можно утверждать, что, поскольку пользователь действительно интересуется вероятностями (не журнальными вероятностями), эта ужасная относительная ошибка не является проблемой. Вероятно, что обычно это не так, но я пишу библиотечную функцию, и я бы хотел, чтобы ее клиенты могли рассчитывать на относительную ошибку не намного хуже, чем ошибка округления.l o g s u mехр(LограммsUм(Икс,Y))LограммsUм

Кажется, мне нужен новый подход. Что бы это могло быть?


Я не понимаю ваш последний абзац. «в эпсилоне» для меня ничего не значит. Вы имеете в виду подразделение на последнем месте ? Что касается пользователей, заинтересованных в вероятностях, небольшая ошибка вероятности записи в журнал приведет к большой вероятностной ошибке, так что это не так.
Арон Ахмадиа

Из любопытства, вы пытались взять «лучший из» ваших двух методов и изобразить ошибку этого? Тогда все, что вам нужно, - это правильная логика, позволяющая определить, в каком случае вы находитесь (в любом случае, мы надеемся, что она менее затратная или в любом случае является частью требуемой стоимости алгоритма), а затем переключиться на соответствующий метод.
Арон Ахмадиа

@AronAhmadia: «Внутри эпсилона» означает относительную погрешность, меньшую, чем у эпсилона с плавающей запятой двойной точности, что составляет около 2,22e-16. Для нормальных (т. Е. Не субнормальных) поплавков это соответствует примерно ульпу. Кроме того, если - абсолютная ошибка x , то относительная ошибка exp ( x ) равна exp ( a ) - 1 , что почти равно тождественной функции около нуля. IOW, маленькая абсолютная ошибка для x подразумевает небольшую относительную ошибку для exp ( x ) . aИксехр(Икс)ехр(a)-1Иксехр(Икс)
Нил Торонто

Приложение: когда абсолютная ошибка близка к нулю. Например, когда a > 1 , вы правы: родственник взрывается. aa>1
Нил Торонто

Ответы:


12

Формула должна быть численно устойчивой. Она обобщает численно устойчивое вычисление log i e x i = ξ + log i e x i -

LограммsUм(Икс,Y)знак равноМаксимум(Икс,Y)+Lограмм1п(ехр(-абс(Икс-Y))
журналΣяеИксязнак равноξ+журналΣяеИкся-ξ,   ξзнак равноМаксимумяИкся

Если логарифм очень близок к нулю и вам нужна высокая относительная точность, вы, вероятно, можете использовать используя точная (т. е. с более чем двойной точностью) реализация l e x p ( z ) : = log ( 1 + e - | z | )

LограммsUм(Икс,Y)знак равноМаксимум(Икс,Y)+LеИксп(Икс-Y)
LеИксп(Z)знак равножурнал(1+е-|Z|)
которая близка к линейной при малых .Z

С точки зрения абсолютной ошибки, это так. С точки зрения относительной ошибки, это ужасно, когда выходной сигнал близок к нулю.
Нил Торонто

ИксY

Для x = -0,775 и y = -0,6175 я получаю ошибку 62271 ульпс и относительную ошибку 1.007e-11.
Нил Торонто

1
Вычислите высокоточные точки данных в интересующем диапазоне - как минимум два различных диапазона необходимы из-за асимптотики. Можно использовать определяющее выражение для z, не близкого к нулю. Для исключительного диапазона подойдет рациональная функция достаточно высокой степени, чтобы получить желаемую точность. Для численной устойчивости используйте полиномы Бернштейна или полиномы Чебычева в числителе и знаменателе, адаптированные к интересующему интервалу. В конце развернитесь в непрерывную дробь и выясните, насколько можно обрезать коэффициенты, не представляя точности.
Арнольд Ноймайер,

1
Lзнак равноL(Z)м
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.