如何实现数值稳定的加权logaddexp?

Nei*_*l G 7 language-agnostic math numerical-stability

什么是数值最稳定的计算方法:

log[(wx * exp(x) + wy * exp_y)/(wx + wy)]
Run Code Online (Sandbox Code Playgroud)

重量在哪里wx, wy > 0

如果没有权重,这个函数logaddexp可以在Python中用NumPy实现,如下所示:

tmp = x - y
return np.where(tmp > 0,
                x + np.log1p(np.exp(-tmp)),
                y + np.log1p(np.exp(tmp)))
Run Code Online (Sandbox Code Playgroud)

我应该如何将其推广到加权版本?

rth*_*rth 5

logaddexp如果将加权表达式重写为,则可以将原始函数用于此目的,

新的logadd表达式

这相当于,

logaddexp( x + log(w_x), y + log(w_y) ) - log(w_x + w_y)
Run Code Online (Sandbox Code Playgroud)

它应该与原始logaddexp实现一样在数值上稳定.

注:我指的numpy.logaddexp是发生在函数xy,不xexp_y,因为你在这个问题提了.