log sum exp

  • メモ
  • 指数関数を使うと値が小さくなりすぎるものの足し合わせの際に、複数の値の相対値がそれほど小さくならないことを利用して、計算の精度を担保する方法
f <- function(a,b){
	#log(exp(a)+exp(b))
	b + log(exp(a-b)+1)
}

g <- function(as){
	if(length(as)==2){
		return(f(as[1],as[2]))
	}else{
		tmpa <- as[1]
		tmpb <- as[-1]
		return(f(tmpa,g(tmpb)))
	}
}

n <- 100
as <- runif(n)
as <- (-1) * runif(n) * 10^2
as[1] <- as[1] * 10^4
out1 <- g(as)
out2 <- log(sum(exp(as)))

out1
out2
exp(out1)
exp(out2)