По какой-то злой причине мне нужно вычислить логарифм суммы 500 сверхмалых вероятностей, каждый член вычисляется
dmvnorm(X[,i], mean=rep(0,3), sigma=diag(3))
Иногда приведенные выше коды возвращают 0 из-за потери значимости, но можно использовать логарифмы.
dmvnorm(X[,i], mean=rep(0,3), sigma=diag(3), log=TRUE)
Я знаю, что могу математически обрабатывать два термина: log(p1 + p2) = log(p2) + log(1 + p1/p2)
. Но можем ли мы обобщить этот подход на большее количество терминов? У кого больше опыта в этом?
Кстати, я написал рекурсивную функцию для вычисления этого. Математически это работает. Но я не думаю, что это практично.
MESSY <- function (pv)
{
N <- length(pv)
if (N==1)
{return(pv[1])}
else
{w <- pv[N]
pv <- pv[1:N-1]-w
return(w + log(1 + exp(MESSY(pv))))
}
}
Поскольку некоторые p очень малы, и я могу использовать только w=log(p)
, у нас есть log(exp(w1)+exp(w2)) = w2 + log(1+exp(w1-w2))
и log(exp(w1)+exp(w2)+exp(w3)) = w3 + log(1 + exp(w1-w3) + exp(w2-w3))
для двух и трех терминов.
log(p2) + log(1 + p1/p2)
более точным, чемlog(p1 + p2)
? Все еще кажется, чтоp1/p2
будет проблематично. - person Gregor Thomas   schedule 14.01.2020log_sum_exp( )
илиlogSumExp( )
. Ты знаешь, из какого они пакета? - person Paw in Data   schedule 15.01.2020logspace_add <- function(logx,logy) { max(logx,logy) + log1p(exp(-abs(logx - logy))) }
(это для двух элементов, надо бы подумать, как обобщить...) - person Ben Bolker   schedule 15.01.2020