태그 보관물: c++

c++

매우 작은 가능성 값을 확률로 변환 (정규화) 각 가능성에 대해 정규화해야합니다. 따라서

모델이 주어지면 데이터 세트 목록에 대한 가능성을 계산 한 다음 각 가능성에 대해 정규화해야합니다. 따라서 [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

α나는={비λ나는−λ엔,λ나는−λ엔≥로그⁡(ϵ)−로그⁡(엔)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αj≥1

((n−1)ϵ/n)/A<ϵ

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

αi

λi

n

BTW,이 처방전은 로그의 기초가 보다 크다고 가정했습니다 . 염기 B 미만 1 염기가 동일 것처럼 그리고 제 부정 모든 로그 진행할 1 / B .

1

b

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

답변