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


18

Я намагаюся реалізувати наступну функцію у плаваючої точки з подвійною точністю з низькою відносною помилкою:

logsum(x,y)=log(exp(x)+exp(y))

Це широко використовується в статистичних додатках для додавання ймовірностей або щільності ймовірностей, які представлені в журнальному просторі. Звичайно, або або \ exp (y) можуть легко переповнюватись або перетікати, що було б погано, оскільки використовується журнальний простір, щоб уникнути переливу в першу чергу. Це типове рішення:exp ( y )exp(x)exp(y)

logsum(x,y)=x+log1p(exp(yx))

Скасування з yx трапляється, але пом'якшується exp . Набагато гірше - це коли х і лог1p(досвід(у-х)) близькі. Ось відносний графік помилок:

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

Ділянка відрізається на щоб підкреслити форму кривої , щодо якої відбувається скасування. Я бачив помилку до і підозрюю, що вона стає набагато гіршою. (FWIW, функція "основна правда" реалізована за допомогою плавців довільної точності MPFR з 128-бітовою точністю.) l o g s u m ( x , y ) = 0 10 - 1110-14логсум(х,у)=010-11

Я спробував інші переформулювання, все з тим самим результатом. Якщо як зовнішній вираз, однакова помилка виникає, приймаючи журнал чогось поблизу 1. З як зовнішнім виразом, у внутрішньому виразі відбувається скасування.l o g 1 pжурналлог1p

Тепер абсолютна помилка дуже мала, тому має дуже малу відносну похибку (в межах епсилона). Можна стверджувати, що оскільки користувач дійсно зацікавлений у ймовірностях (а не ймовірностях журналу), ця жахлива відносна помилка не є проблемою. Можливо, зазвичай це не так, але я пишу функцію бібліотеки, і я хотів би, щоб її клієнти могли розраховувати на відносну помилку не набагато гіршу, ніж помилка округлення.l o g s u mдосвід(логсум(х,у))логсум

Здається, мені потрібен новий підхід. Що це може бути?


Я не розумію вашого останнього абзацу. "всередині епізону" для мене нічого не означає. Ви маєте на увазі підрозділ на останньому місці ? Що стосується користувачів, які цікавляться ймовірностями, невелика помилка ймовірності журналу призведе до великої помилки ймовірності, тому це не так.
Арон Ахмадія

З цікавості ви намагалися взяти "найкраще" з ваших двох методів та намітити помилку? Тоді все, що вам потрібно, - це правильна логіка, щоб визначити, у якому випадку ви знаходитесь (сподіваємось, що це менш затратно або частина необхідної вартості алгоритму), а потім перейти на відповідний метод.
Арон Ахмадія

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

Додавання: Коли абсолютна похибка майже до нуля. Наприклад, коли a > 1 , ти маєш рацію: відносний вибухає. аа>1
Ніл Торонто

Відповіді:


12

Формула повинна бути чисельно стабільною, вона узагальнюється до чисельно стійкого обчислення log i e x i = ξ + log i e x i -

логсум(х,у)=макс(х,у)+лог1p(досвід(-абс(х-у))
журналiехi=ξ+журналiехi-ξ,   ξ=максiхi

логсум(х,у)=макс(х,у)+лехp(х-у)
лехp(z): =журнал(1+е-|z|)
z

З точки зору абсолютної помилки, це так. З точки зору відносної помилки, жахливо, коли вихід майже до нуля.
Ніл Торонто

ху

Для х = -0,775 і у = -0,6175 я отримую 62271 помилку ульп і відносну помилку 1.007е-11.
Ніл Торонто

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

1
л=л(z)м
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.