2014-11-09 4 views
0

언어 모델에 대한 복잡도 값을 계산하는 중이고 많은 계산이 필요합니다. BigDecimal을 사용하여 계산을 로그 스페이스로 변환하려고 시도했지만 행운이 없습니다.스칼라 : 큰 계산 값이 0/무한대로 줄어 듭니다.

var sum=0.0 
for(ngram<-testNGrams) 
{ 
    var prob = Math.log(lm.prob(ngram.last, ngram.slice(0,ngram.size-1))) 
    if (prob==0.0) sum = sum 
    else sum = sum + prob 
} 
Math.pow(Math.log(Math.exp(sum)),-1.0/wordSize.toDouble) 

크고 작은 값을 영/무한대로 잃지 않고 스칼라에서 어떻게 계산할 수 있습니까? 그것은 사소한 질문처럼 보이지만 그것을 할 수 없었습니다.

위의 경우, lm.prob 메소드가 0과 1 사이의 정확한 확률을 발행한다고 가정 할 수 있습니다. 이는 충분히 검증 된 것입니다.

답변

1

모든 것을 가능성이 아니라 로그 확률로 기입하십시오.

예를 들어 log(exp(sum))과 같은 것들은 유용한 정보를 버리고 CPU를 워밍업합니다. 기피!

실제 확률로 변환해야 할 경우 마지막 단계에서 수행하십시오.

+0

당신이 볼 수 있듯이, 난 마지막 행까지 로그 probs를 사용하려고하는데, 여기서 나는 곤란에 대한 가치를 얻을 필요가있다. – user3297367

+0

@ user3297367 - 나는 그게 어떻게 당혹 스러울 지 잘 모르겠습니다. 'log (exp (sum)) '용어가 없습니다 (어쨌든 그것은 신원 함수입니다). 당신은'-1/N' 지수를하기 위해'pow'를 사용하려고합니까? 그냥'-sum/N'은 어때? 그러나 그 힘을 발휘할 필요가 있습니다. (그리고 그 힘을 키우는 것이 전형적이지 않습니까?) 베이스 e보다 로그베이스 2를 사용하는 것이 더 일반적입니다. –

관련 문제