log(exp P1 + exp P2 + ...) の計算

指数型の確率分布の対数尤度計算などで

 \log (\exp P_1 + \exp P_2 + \cdots + \exp P_n)

といった形が出てくるがそのままプログラミングすると double 型でもすぐにオーバーフローして NaN になってしまう。そのため、 P_{max} = \max_i P_i でくくると良い。

 \begin{eqnarray} \log (\exp P_1 + \exp P_2 + \cdots + \exp P_n) &=& \log \left( \exp P_{max} (\exp(P_1 - P_{max}) + \exp(P_2 - P_{max}) + \cdots + \exp(P_n - P_{max}) \right) \\ &=& P_{max} + \log \left( \exp(P_1 - P_{max}) + \exp(P_2 - P_{max}) + \cdots + \exp(P_n - P_{max}) \right) \end{eqnarray}

せっかく意味単位でクラス設計をしても、こういった数値計算の順序の問題で裏口のようなインターフェイスを作らないといけない場合が結構あるように思うのだけど、専門の方はどうしているんだろう?