infやnanになる条件
Sponsored Links
皆さんこんにちは
お元気ですか。私は元気です。
機械学習のプログラムを書いていると、infとnanの地獄に巻き込まれることが多々有ります。
正直、戦いたくはないのですが…。
こんな時に出そうなinfやnanの条件を纏めてみました。
Nan=値が数でない時に出現する。
inf=値が無限大でない時に出現する。
とりあえず、ソースコードをペタっと
infやnanのサンプル
#include <iostream> #include <math.h> using namespace std; int main(int argc, char const *argv[]){ double log_x = log(0); double exp_ma = exp(750); cout << log_x << endl; cout << exp_ma << endl; cout << 0 / 0 << endl; cout << exp_ma / exp_ma << endl; cout << log_x / log_x << endl; cout << exp_ma + log_x << endl; return 0; }
1.logを0で割る
logを0で割るとnanが出現する。
特に機械学習アルゴリズムを組むとき要素が0になることがあるので、気をつけて実装してください。
2.ゼロディバイド
0で割るとnanが出現する。うっかり見逃しがち、割るときは十分に気をつけましょう
3.オーバーフロー
e^730乗ぐらいでオーバーフローするそうです。
これもよくやる。すぐに730超えますからね。logsumexpなる手段が世間にはあるそうで。
それを利用するとオーバーフローは超えれます。
4.無限大で計算をするとnanになる。
infをinfで割るとnanになる。ヘタすると伝播して何が何だかわからなくなる原因。
逐一調べましょう。
InfやNanの判定
次にチェックの方法です
==とかではなく isnanやisinfのマクロを使って行います
if(isnan(exp_ma + log_x)){ cout << "出力がnanです。" << endl; } if(isinf(exp_ma)){ cout << "出力がinfです。" << endl; }