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


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 . 그런 다음 평소대로 진행하여 결과 값을 지수화하고 각 지수를 모든 지수의 합으로 나눕니다.ϵϵ=10−ddnϵ/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 α j ≥ 1 이며,제로 교체 규칙으로 인한총상대오차가 ( ( n - 1 ) ϵ / n ) / A < ε 로서 원하는.α엔=비λ엔−λ엔=비0=1α나는에이=∑jαj≥1((n−1)ϵ/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 ) = −ϵ=10−16엔=삼−0.282로그⁡(ϵ/엔)로그⁡(10−16)−로그⁡(삼) 세 차이의 첫 번째는, - 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.