2012-01-06 3 views
1

내가으로 제공되는 일반적인 로그 가능성을 계산하기 위해 노력하고 있습니다 :수치 안정적인 방법은 정상적인 로그 가능성을 계산하는

L = l1+l2+l3+...+ln, 

lk = log(1/(sqrt(2*PI)*sigma_k))-0.5*e_k*e_k 

Sigmas 주위 0.2 있습니다

e_k가 정규 분포를 평균은 0이고 단위는 분산이므로 대부분이 -2와 2 사이입니다.

난 다음 자바 코드를 시도 (sigma_k가 = sigmas.get 상술 한 (K) * Math.sqrt (DT))

private double new1(List<Double> residuals, List<Double> sigmas, double dt) { 
    double a = 0; 
    for(int i=0; i<sigmas.size(); i++) { 
     a += Math.log(1.0/(Math.sqrt(2*Math.PI*dt)*sigmas.get(i))); 
    } 
    double b = 0; 
    for(int i=0; i<residuals.size(); i++) { 
     b += residuals.get(i)*residuals.get(i); 
    } 
    return a-0.5*b; 
} 

하지만 이론적 최대 I 수행하여 얻은 최대보다 낮은 수치 적 최적화, 그래서 나는 내 방법이 차선책이라는 의혹을 가지고있다. 그것은 크게 수치 안정성을 향상시킬 경우

답변

0

는 잘 모르겠지만, 귀하의 방정식이 대수 법을 사용하여 단순화 할 수 있습니다

log(a*b) = log(a) + log(b) 
log(1/a) = -log(a) 
log(sqrt(a)) = log(a)/2 

을 그래서 당신은이 :

lk = -log(2*pi)/2 - log(sigma_k) - 0.5*e_k*e_k 
    = -log(2*pi)/2 - log(dt)/2 - log(sigmas.get(k)) - 0.5*e_k*e_k 
    = -log(2*pi*dt)/2 - log(sigmas.get(k)) - 0.5*e_k*e_k 

먼저, 그래서 일정 첫 번째 루프에서는 a -= log(sigmas.get(k)) 만 수행하면됩니다.

또한 첫 번째 루프가 sigmas.size()이고 두 번째 루프가 residuals.size() 인 것으로 나타났습니다. 방정식에서 제안하는 것처럼 동일한 길이를 가져야합니다.

0

비고 일부 지역 확률이 /통계 언어 조합 주파수에서 예를 들어, 로그을 고려하지 않고 계산된다.

다음은 단순화되고 덜 안정화되지만 이후에는 로그의 합계로 다시 변환됩니다.


double a = 0; 
for(int i=0; i<sigmas.size(); i++) { 
    a += Math.log(1.0/(Math.sqrt(2*Math.PI*dt)*sigmas.get(i))); 
} 

로그 (X) + 로그 (Y) = 로그 (x * y)이라고

double a = 1.0; 
for(int i=0; i<sigmas.size(); i++) { 
    a *= 1.0/(Math.sqrt(2*Math.PI*dt)*sigmas.get(i)); 
} 
a = Math.log(a); 

(1/X) * (1/y) = 1/(x * y)

double a = 1.0; 
for(int i=0; i<sigmas.size(); i++) { 
    a *= Math.sqrt(2*Math.PI*dt)*sigmas.get(i); 
} 
a = Math.log(1.0/a); 
012 3,516,

SQRT (X)^N = (X^0.5)^X^N = (N/2)

static import Math.*; 

double a = pow(2*PI*dt, sigmas.size()/2.0); 
for(int i=0; i<sigmas.size(); i++) { 
    a *= sigmas.get(i); 
} 
a = -log(a);