Conversione (normalizzazione) di valori di probabilità molto piccoli in probabilità


21

Sto scrivendo un algoritmo in cui, dato un modello, calcolo le probabilità per un elenco di set di dati e quindi ho bisogno di normalizzare (con probabilità) ciascuna delle probabilità. Quindi qualcosa come [0,00043, 0,00004, 0,00321] potrebbe essere convertito in potrebbe essere come [0,2, 0,03, 0,77].

Il mio problema è che le probabilità di log, con cui sto lavorando, sono piuttosto piccole (ad esempio, nello spazio log, i valori sono come -269647.432, -231444.981 ecc.). Nel mio codice C ++, quando provo ad aggiungerne due (prendendo il loro esponente) ottengo una risposta di "Inf". Ho provato ad aggiungerli nello spazio-log (Somma / Sottrazione del log) , ma mi sono imbattuto nuovamente nello stesso problema.

Qualcuno può condividere la sua opinione di esperti su questo?


Quando hai usato le funzioni che hai indicato per coinvolgere log(1+...) , hai usato la log1pfunzione nella tua lingua? Questo utilizza l'espansione di Taylor intorno all'1.
Neil G

1
Vedi anche alcune precedenti discussioni correlate qui
Glen_b -Restate Monica

Risposte:


30

Sottrai il logaritmo massimo da tutti i registri. Butta via tutti i risultati che sono così negativi da sottovalutare l'esponenziale. (Le loro probabilità sono, a tutti gli effetti pratici, zero).

Infatti, se si desidera una precisione relativa di ε (come ϵ=10d per le cifre di precisione d ) e si hanno n probabilità, buttare via qualsiasi risultato inferiore al logaritmo di ϵ/n . Quindi procedere come al solito per esponenziare i valori risultanti e dividere ciascuno per la somma di tutti gli esponenziali.

λ1,λ2,,λnb > 1λn=max(λio)B>1

αio={Bλio-λn,λio-λnlog(ε)-log(n)0altrimenti.

Le probabilità normalizzate equivalgono a , Questo funziona perché la sostituzione di zero di tutti gli underflow con zero fa un errore totale al massimo considerando che, poiché e tutti sono non negativi, il denominatore , da cui l' errore relativo totale dovuto alla regola di sostituzione zero è strettamente inferiore a , come desiderato. i = 1 , 2 , , n . α i ( n - 1 ) ϵ / n < ϵ α n = b λ n - λ n = b 0 = 1 α i A = j α j1 ( ( n - 1αio/Σj=1nαjio=1,2,...,n.αio(n-1)ε/n<εαn=Bλn-λn=B0=1αioUN=Σjαj1((n-1)ε/n)/UN<ε

Per evitare troppi errori di arrotondamento, calcolare la somma iniziando con i valori più piccoli di . Questo verrà fatto automaticamente quando i vengono ordinati per la prima volta in ordine crescente. Questa è una considerazione solo per molto grandi .λ i nαioλion

A proposito, questa prescrizione presuppone che la base dei registri sia maggiore di . Per basi inferiori a , prima negare tutti i registri e procedere come se la base fosse uguale a .b 1 1 / b1B11/B


Esempio

Lascia che ci siano tre valori con logaritmi (log naturali, diciamo) uguali a e L'ultimo è il più grande; sottraendolo da ciascun valore si ottiene e- 231444.981 , - 231444.699. - 38202.733 , - 0.282 , 0.-269647.432, -231444.981,-231.444,699.-38202.733, -0,282,0.

Supponiamo che desideri una precisione comparabile ai doppi IEEE (circa 16 cifre decimali), in modo che e . (Non puoi effettivamente raggiungere questa precisione, perché è dato solo a tre cifre significative, ma va bene: stiamo solo gettando via i valori che sono garantiti per non influenzare il meglio della precisione che desideri e la precisione che in realtà have.) Calcola = = La prima delle tre differenze, è inferiore a questa, quindi via, lasciando solo e dà n = 3 - 0.282 log ( ϵ / n ) log ( 10 - 16 ) - log ( 3 ) - 37.93997. - 38202.733 , - 0.282 0. exp ( - 0.282 ) = 0.754 exp ( 0 ) = 1 0 0.754 / ( 1 + 0.754 ) =ε=10-16n=3-0,282log(ε/n)log(10-16)-log(3)-37,93,997 mila.-38202.733,-0,2820.exp(-0,282)=0,754 e (ovviamente). I valori normalizzati sono - in ordine - per quello che hai gettato via, e .exp(0)=100,754/(1+0,754)=0,4301/(1+0.754)=0.570


Questo è geniale - così semplice e così evidente col senno di poi. @Ikram, contrassegnalo come la risposta corretta! (a meno che ovviamente tu non abbia qualcosa di meglio, nel qual caso ti preghiamo di condividere)
zelanix

2
@whuber dobbiamo anche buttare via ? Esponenziale che ci dà comunque zero, e quindi non contribuirà alla somma. 38202.733
Taylor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.