次のような関数があるとします。
f <- function(x){
exp(x) / (1 + exp(x))
}
これは、xの任意の実際の値で機能するはずですが、実際には、xが710以上の場合、NaNを返します。この問題を処理する適切な方法は何だろうと思います。1を返すだけにするのは簡単だと思いますが、統計学者の観点からは、それは良い行動ではないかもしれません。誰かコメントや提案がありますか?
次のような関数があるとします。
f <- function(x){
exp(x) / (1 + exp(x))
}
これは、xの任意の実際の値で機能するはずですが、実際には、xが710以上の場合、NaNを返します。この問題を処理する適切な方法は何だろうと思います。1を返すだけにするのは簡単だと思いますが、統計学者の観点からは、それは良い行動ではないかもしれません。誰かコメントや提案がありますか?
回答:
この場合、NaN
指数ではない計算が倍精度演算でオーバーフローするため、(数値ではない)が返されます。
MacLaurinシリーズで中心に展開された代数的に等価な式は、次のとおりです。
これは交互のシリーズであるため、任意の項の削除で発生するエラーは、次の項のサイズ以下です。したがって、場合、エラーは真の値に対してです。これは、どの統計計算よりもはるかに正確であるため、この状況では戻り値をに置き換えます。EXP (- 710 )≈ 10 - 308 ≈ 2 - 1024個の 1
興味深いことに、指数アンダーフローがR
発生することはありません。したがって、あなただけの符号に応じて、計算のより信頼性の高いバージョンを選ぶことができるのように、NaN
x
f <- function(x) ifelse(x < 0, exp(x) / (1 + exp(x)), 1 / (1 + exp(-x)))
この問題はほとんどすべてのコンピューティングプラットフォームで発生し(まだ例外は確認していません)、オーバーフローとアンダーフローの処理方法が異なります。指数関数はこれらの種類の問題を作成することで悪名高いですが、それだけではありません。したがって、問題を解決するだけでは十分ではありませんR
。優れた統計学者は、コンピュータの算術の原理を理解し、これらを使用してコンピューティング環境の特異性を検出および回避する方法を知っています。