모델이 주어지면 데이터 세트 목록에 대한 가능성을 계산 한 다음 각 가능성에 대해 정규화해야합니다. 따라서 [0.00043, 0.00004, 0.00321]과 같은 것은 [0.2, 0.03, 0.77]과 같은 것으로 변환 될 수 있습니다.
내 문제는 내가 작업하고있는 로그 가능성이 매우 작다는 것입니다 (예를 들어, 로그 공간에서 값은 -269647.432, -231444.981 등입니다). 내 C ++ 코드에서 (두 개의 지수를 사용하여) 두 개를 추가하려고하면 “Inf”라는 대답이 나타납니다. 로그 공간 ( 로그 요약 / 뺄셈)에 추가하려고했지만 동일한 문제가 다시 발생했습니다.
아무도 이것에 대한 전문가의 의견을 공유 할 수 있습니까?
답변
모든 로그에서 최대 로그를 뺍니다. 음수 인 모든 결과를 버리면 지수가 넘치게됩니다. (그들의 가능성은 모든 실제적인 목적을 위해 0입니다.)
당신의 상대 정밀도를 원하는 경우 사실, (예 : ε = 10 – D 에 대한 D의 정밀도 자리)와 당신이 N 우도의 대수보다 적은 어떤 결과를 버리지 ε / N . 그런 다음 평소대로 진행하여 결과 값을 지수화하고 각 지수를 모든 지수의 합으로 나눕니다.
ϵϵ=10−d
d
n
ϵ/n
공식을 좋아하는 사람들을 위해 로그 는 λ n = max ( λ i ) 인 으로하십시오 . 밑수 대한 로그의 경우 다음을 정의하십시오.
λ1,λ2,…,λnλn=max(λi)
b>1
정규화 된 가능성은 , 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λi
n
BTW,이 처방전은 로그의 기초가 보다 크다고 가정했습니다 . 염기 B 미만 1 염기가 동일 것처럼 그리고 제 부정 모든 로그 진행할 1 / B .
1b
1
1/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.282
0.
특급(−0.282)=0.754
특급(0)=1
0
0.754/(1+0.754)=0.430
이다.
1/(1+0.754)=0.570