매우 작은 가능성 값을 확률로 변환 (정규화)


21

모델이 주어지면 데이터 세트 목록에 대한 가능성을 계산 한 다음 각 가능성에 대해 정규화해야합니다. 따라서 [0.00043, 0.00004, 0.00321]과 같은 것은 [0.2, 0.03, 0.77]과 같은 것으로 변환 될 수 있습니다.

내 문제는 내가 작업하고있는 로그 가능성이 매우 작다는 것입니다 (예를 들어, 로그 공간에서 값은 -269647.432, -231444.981 등입니다). 내 C ++ 코드에서 (두 개의 지수를 사용하여) 두 개를 추가하려고하면 "Inf"라는 대답이 나타납니다. 로그 공간 ( 로그 요약 / 뺄셈)에 추가하려고했지만 동일한 문제가 다시 발생했습니다.

아무도 이것에 대한 전문가의 의견을 공유 할 수 있습니까?


당신은 당신이 포함 가리키는 기능을 사용할 경우 , 당신은 사용 했 언어의 기능을? 이것은 1 주위의 Taylor 확장을 사용합니다.로그(1+)log1p
Neil G

1
또한 이전의 관련 토론도 참조 하십시오
Glen_b-복지국 모니카

답변:


30

모든 로그에서 최대 로그를 뺍니다. 음수 인 모든 결과를 버리면 지수가 넘치게됩니다. (그들의 가능성은 모든 실제적인 목적을 위해 0입니다.)

당신의 상대 정밀도를 원하는 경우 사실, (예 : ε = 10 - D 에 대한 D의 정밀도 자리)와 당신이 N 우도의 대수보다 적은 어떤 결과를 버리지 ε / N . 그런 다음 평소대로 진행하여 결과 값을 지수화하고 각 지수를 모든 지수의 합으로 나눕니다.ϵϵ=10ddnϵ/n

공식을 좋아하는 사람들을 위해 로그 는 λ n = max ( λ i ) 인 으로하십시오 . 밑수 대한 로그의 경우 다음을 정의하십시오.λ1,λ2,,λnλn=max(λi)b>1

α나는={λ나는λ,λ나는λ로그(ϵ)로그()0그렇지 않으면.

정규화 된 가능성은 , i = 1 , 2 , , n과 같습니다 . 그렇지 않으면 언더 플로가되는 모든 α i 를 0으로 대체 하면 최대 n ( n - 1 ) ϵ / n < ϵ 의 총 오차가 발생 하지만 α n = b λ n - λ n = b 0 = 이기 때문에 작동합니다.α나는/j=1αj나는=1,2,,.α나는(1)ϵ/<ϵ 이고 모든 α i 는 음수가 아니고 분모 A = j α j1 이며,제로 교체 규칙으로 인한총상대오차가 ( ( n - 1 ) ϵ / n ) / A < ε 로서 원하는.α=λλ=0=1α나는에이=jαj1((n1)ϵ/n)/A<ϵ

반올림 오류를 너무 많이 피하려면 의 가장 작은 값으로 시작하는 합계를 계산하십시오 . 이것은 λ i 가 처음으로 오름차순으로 정렬 될 때 자동으로 수행됩니다 . 이것은 매우 큰 n에 대해서만 고려할 사항 입니다.αiλin

BTW,이 처방전은 로그의 기초가 보다 크다고 가정했습니다 . 염기 B 미만 1 염기가 동일 것처럼 그리고 제 부정 모든 로그 진행할 1 / B .1b11/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 우리는 당신이 원하는 정밀도와 정확도 실제로 당신의 더 나은 영향을 미치지 않도록 보장 값을 버리고있어 : 단지 세 개의 유효 숫자가 주어집니다,하지만 괜찮아요 계산 로그 ( ϵ / n ) = 로그 ( 10 16 ) 로그 ( 3 ) = ϵ=1016=0.282로그(ϵ/)로그(1016)로그() 세 차이의 첫 번째는, - 38202.733는 , 그래서 그냥 떠나 멀리 던져 덜이보다 - 0.282 0 그들이 제공 제곱 승 애 썼는데 ( - 0.282 ) = 0.754 특급 ( 0 ) = 1 (물론). 버린값의 순서는 0 , 0.754 / ( 1 + 0.754 ) = 0.430 1 / ( 1 +37.93997.38202.733,0.2820.특급(0.282)=0.754특급(0)=100.754/(1+0.754)=0.430 이다.1/(1+0.754)=0.570


이것은 훌륭합니다-너무 간단하고 가늠하기에는 분명합니다. @Ikram, 정답으로 표시하십시오! (물론 더 좋은 것이 없다면 공유하십시오)
zelanix

2
@ whuber 합니까? 그것을 지수화하면 어쨌든 우리에게 0을 제공하므로 합계에 기여하지 않습니다. 38202.733
테일러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.