Перетворення (нормалізація) дуже малих значень ймовірності у ймовірність


21

Я пишу алгоритм, де, задаючи модель, я обчислюю ймовірність списку наборів даних, а потім потрібно нормалізувати (до ймовірності) кожного з вірогідних. Тож щось на зразок [0,00043, 0,00004, 0,00321] може бути перетворене на таке, як [0,2, 0,03, 0,77].

Моя проблема полягає в тому, що ймовірність журналу, з якою я працюю, зовсім невелика (наприклад, у просторі журналу значення такі, як -269647.432, -231444.981 тощо). У своєму коді C ++, коли я намагаюся додати два з них (приймаючи їх показник), я отримую відповідь "Inf". Я спробував додати їх у журнал-простір (Підсумовування / Віднімання журналу) , але знову натрапив на ту ж проблему.

Чи може хтось поділитися своєю експертною думкою з цього приводу?


Коли ви використовували функції, на які ви вказали, що включають , чи використовували ви цю функцію мовою? Для цього використовується розширення Тейлора близько 1.log(1+)log1p
Ніл G

1
Дивіться також декілька раніше, пов’язаних тут
Glen_b -Встановіть Моніку

Відповіді:


30

Відняти максимальний логарифм з усіх журналів. Викиньте всі настільки негативні результати, що вони переповнюють показник. (Їх вірогідність для всіх практичних цілей дорівнює нулю.)

Дійсно, якщо ви хочете відносної точності (наприклад, для цифр точності) і маєте ймовірностей, киньте будь-який результат менший, ніж логарифм . Потім продовжуйте, як зазвичай, експоненцію отриманих значень і діліть кожне на суму всіх експонентів.ϵ = 10 - d d n ϵ / nϵϵ=10ddnϵ/n

Для тих, хто любить формули, нехай логарифми будуть з . Для логарифмів до бази визначтеλ1,λ2,,λnb > 1λn=max(λi)b>1

αi={bλiλn,λiλnlog(ϵ)log(n)0otherwise.

Нормалізовані ймовірності рівні , Це працює, тому що заміна всіх інакше перетікаючих нулем робить загальну помилку максимум тоді як, тому що і всі невід'ємні, знаменник , звідки загальна відносна похибка внаслідок правила заміни нуля суворо менша, ніж , за бажанням. i = 1 , 2 , , n . α i ( n - 1 ) ϵ / n < ϵαi/j=1nαji=1,2,,n.αi(n1)ϵ/n<ϵα i A = j α j1αn=bλnλn=b0=1αiA=jαj1((n1)ϵ/n)/A<ϵ

Щоб уникнути занадто великої помилки округлення, обчисліть суму, починаючи з найменших значень . Це буде зроблено автоматично, коли вперше відсортовано у порядку зростання. Це врахування лише для дуже великих .λ i nαiλin

До речі, цей припис припускає, що основа журналу більша за . Для підстав менше, ніж , спочатку занеміть усі колоди і продовжуйте так, ніби підстава дорівнює .b 1 1 / b1b11/b


Приклад

Нехай є три значення з логарифмами (натуральні журнали, скажімо), рівними та Остання - найбільша; віднімання його від кожного значення дає і- 231444.981 , - 231444.699. - 38202.733 , - 0.282 , 0.269647.432, 231444.981,231444.699.38202.733, 0.282,0.

Припустимо, ви хочете, щоб точність, порівнянна з подвійними IEEE (приблизно 16 десяткових цифр), так що і . (Насправді ви не можете досягти цієї точності, тому що задається лише трьома значущими цифрами, але це нормально: ми лише викидаємо значення, які гарантовано не вплинуть на кращу точність та точність, яку ви насправді мають.) Обчислити = = Перша з трьох різниць, менша від цієї, тому киньте її, залишивши лише і Показник їх дає n = 3 - 0,282 log ( ϵ / n ) log ( 10 - 16 ) - log ( 3 ) - 37,93997. - 38202.733 , - 0,282 0. ехр ( - 0,282 ) = 0,754 ехр ( 0 ) = 1 0 0,430 1 / ( 1 + 0,754 )ϵ=1016n=30.282log(ϵ/n)log(1016)log(3)37.93997.38202.733,0.2820.exp(0.282)=0.754 і (звичайно). Нормовані значення - для того, щоб для того, що ви викинули, , і .exp(0)=100.754/(1+0.754)=0.4301/(1+0.754)=0.570


Це геніально - настільки просто і настільки очевидно в огляді. @Ikram, будь ласка, позначте це правильною відповіддю! (якщо, звичайно, у вас є щось краще, в такому випадку, будь ласка, поділіться)
zelanix

2
@whuber нам навіть потрібно викинути ? Експоненція, яка все одно дає нам нуль, і тому вона не сприятиме сумі. 38202.733
Тейлор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.