簡體   English   中英

-Java中的無窮大值

[英]-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

如果參數為正零或負零,則結果為負無窮大。

MathJavadoc解釋了為什么得到-Infinity的原因:

如果參數為正零或負零,則結果為負無窮大。

您應該檢查您的值是否為零,或者在應用對log函數之前將其過濾掉。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM