私は系統樹の最尤法を実装する科学ソフトウェア プロジェクトに取り組んでおり、数値の精度に関する問題に常に直面しています。多くの場合、卑劣さは...
- モデル内で同じ値を持つ競合するアプリケーション間で、
- MLE スコアを手動で計算する場合、
- 計算の操作の順序で。
それは本当にすべて3番目に帰着します。あなたの場合でさえ。小さい数値と非常に大きい数値の乗算は、計算中に指数がスケーリングされるときに奇妙な結果を引き起こす可能性があります。これについては、(悪名高い) 有名な「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」に多くのことが書かれています。しかし、私が言及したことは、それがあなたの興味のすべてであるならば、それの短所です.
全体として、あなたが見ている問題は、関数を計算するときの浮動小数点/倍精度数と演算の表現における厳密な数値の問題です。私は MATLAB にあまり詳しくありませんが、より良い結果が得られる任意精度の型が含まれている可能性があります。
それとは別に、それらをできるだけ長くシンボリックに保ち、変数のサイズについて直感がある場合 ( ina
は に比べて常に非常に大きいためx
)、括弧の順序を賢明に選択していることを確認してください。
最初の方程式は s の加算を扱っているため、より優れているlog
はずであり、2 番目の方程式よりもはるかに安定している必要がありますx^a
。ただし、方程式を支配するので少し疲れますが、実際にはとにかくそうなります。