[英]-Infinity values in Java
我正在嘗試匯總561條日志。
它們看起來像這樣:
-7.314254939475686
-7.656004233197743
-4.816276208120333
-8.426112454893817
-4.771824445549499
-9.34240318676797
因此,它們不是很大的數字。 但是,當我繼續對它們求和時,我得到以下信息:
-2668.179647264475
-2674.7747795369874
-2679.18920466334
-2683.9724816026214
-2690.3342661536453
-Infinity
-Infinity
做到這一點的代碼是:
double probspam=0;
for(int j=0;j<words.size();j++)
{
probspam+= Math.log(spam.getClassProbability(words.get(j)));
}
您是否有關於如何解決-Infinity問題以及為什么會發生的想法? 謝謝
對於某些值, spam.getClassProbability()
返回0.0
: 請參閱docs :
如果參數為正零或負零,則結果為負無窮大。
spam.getClassProbability(words.get(j))
的值很可能在某些時候為零。
Math.log(0.0)
返回負無窮大(如API文檔所述)。
您的垃圾郵件候選者之一從getClassProbability
獲得零:
System.out.println(Math.log(0));
輸出:
-Infinity
這是一個特殊的保留雙-Infinity
值,對其進行的任何操作也會給出-Infinity
,因此一旦它達到零,您的求和變量將保持為-Infinity
要“修復”它,請執行以下操作:
double wordProbSpam = spam.getClassProbability(words.get(j));
probspam += wordProbSpam > 0 ? Math.log(wordProbSpam) : 0;
坦白說,我認為您的方法是有缺陷的。 我只是簡單地將getClassProbability()的結果求和,而不是對它的log求和,因為對於0-1之間的數字,對數是負數,這將使總和變得很奇怪。
如果一個單詞的類別概率為零,則將-Infinity
加到和上。
我認為您已經對此提出了普遍質疑-您的對數為0.0。 即使您的getClassProbability()是完美的,但在數學上講結果為非零時,數字下溢仍可能意味着其返回零。
一種選擇是用Double.ulp(0.0)的值替換所有零。 這是Java可以表示的最小非零值(4.9e-324),對數約為-744.44。 這認識到零概率的破局概念。 畢竟,垃圾郵件發送者非常聰明,因此概率永遠不會真正為零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.